C++中类对象所占空间的大小


   首先,平时所声明的类只是一种类型定义,它本身是没有大小可言的。 因此,如果用sizeof运算符对一个类型名操作,那得到的是具有该类型实体的大小。

计算一个类对象的大小时的规律:

  1. 空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同);
  2. 一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的;
  3. 因此一个对象的大小≥所有非静态成员大小的总和;
  4. 当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable;
  5. 虚承继的情况:由于涉及到虚函数表和虚基表,会同时增加一个(多重虚继承下对应多个)vfPtr指针指向虚函数表vfTable和一个vbPtr指针指向虚基表vbTable,这两者所占的空间大小为:8(或8乘以多继承时父类的个数);
  6. 在考虑以上内容所占空间的大小时,还要注意编译器下的“补齐”padding的影响,即编译器会插入多余的字节补齐;
  7. 类对象的大小=各非静态数据成员(包括父类的非静态数据成员但都不包括所有的成员函数)的总和+vfptr指针(多继承下可能不止一个)+vbptr指针(多继承下可能不止一个)+编译器额外增加的字节。

示例一:含有普通继承

复制代码
 1 class  A   
 2 {   
 3 };  
 4 
 5 class  B   
 6 {   
 7     char   ch;   
 8     virtual void func0(){} 
 9 }; 
10 
11 class   C  
12 {
13     char   ch1;  
14     char   ch2;  
15     virtual void func(){}  
16     virtual void func1(){}   
17 };
18 
19 class  D: public A, public C
20 {   
21     int   in;   
22     virtual void func(){} 
23     virtual void func1(){}
24 };   
25 
26 class  E: public B, public C
27 {   
28     int   in;   
29     virtual void func0(){} 
30     virtual void func1(){}
31 };  
32 
33 //cout<<"A="<<sizeof(A)<<endl;    //result=1
34 //cout<<"B="<<sizeof(B)<<endl;    //result=8    
35 //cout<<"C="<<sizeof(c)<<endl;    //result=8
36 //cout<<"D="<<sizeof(d)<<endl;    //result=12
37 //cout<<"E="<<sizeof(e)<<endl;    //result=20
复制代码

示例二:含有虚继承

复制代码
 1 class CommonBase
 2 {
 3     int co;
 4 };
 5 
 6 class Base1: virtual public CommonBase
 7 {
 8 public:
 9     virtual void print1() {}
10     virtual void print2() {}
11 private:
12     int b1;
13 };
14 
15 class Base2: virtual public CommonBase
16 {
17 public:
18     virtual void dump1() {}
19     virtual void dump2() {}
20 private:
21     int b2;
22 };
23 
24 class Derived: public Base1, public Base2
25 {
26 public:
27     void print2() {}
28     void dump2() {}
29 private:
30     int d;
31 };
复制代码

  sizeof(Derived)=32,其在内存中分布的情况如下:

复制代码
class Derived size(32):
     +---
     | +--- (base class Base1)
   0 | | {vfptr}
   4 | | {vbptr}
   8 | | b1
     | +---
     | +--- (base class Base2)
  12 | | {vfptr}
  16 | | {vbptr}
 20 | | b2
    | +---
 24 | d
    +---
    +--- (virtual base CommonBase)
 28 | co
    +---
引用地址:http://www.cnblogs.com/easonpan/archive/2012/04/25/2470177.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值