C++中类对象所占空间的⼤⼩
  ⾸先,平时所声明的类只是⼀种类型定义,它本⾝是没有⼤⼩可⾔的。因此,如果⽤sizeof运算符对⼀个类型名操作,那得到的是具有该类型实体的⼤⼩。
计算⼀个类对象的⼤⼩时的规律:
1. 空类、单⼀继承的空类、多重继承的空类所占空间⼤⼩为:1(字节,下同);
2. ⼀个类中,虚函数本⾝、成员函数(包括静态与⾮静态)和静态数据成员都是不占⽤类对象的存储空间的;
3. 因此⼀个对象的⼤⼩≥所有⾮静态成员⼤⼩的总和;
4. 当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会⾃动在对象⾥安插⼀个指针vPtr指向虚函数表VTable;
5. 虚承继的情况:由于涉及到虚函数表和虚基表,会同时增加⼀个(多重虚继承下对应多个)vfPtr指针指向虚函数表vfTable和⼀个vbPtr
指针指向虚基表vbTable,这两者所占的空间⼤⼩为:8(或8乘以多继承时⽗类的个数);
6. 在考虑以上内容所占空间的⼤⼩时,还要注意编译器下的“补齐”padding的影响,即编译器会插⼊多余的字节补齐;
7. 类对象的⼤⼩=各⾮静态数据成员(包括⽗类的⾮静态数据成员但都不包括所有的成员函数)的总和+ vfptr指针(多继承下可能不⽌⼀
个)+vbptr指针(多继承下可能不⽌⼀个)+编译器额外增加的字节。
⽰例⼀:含有普通继承
1class  A
2 {
3 };
4
5class  B
6 {
7char  ch;
8virtual void func0(){}
9 };
10
11class  C
12 {
13char  ch1;
14char  ch2;
15virtual void func(){}
16virtual void func1(){}
17 };
18
19class  D: public A, public C
20 {
21int in;
22virtual void func(){}
23virtual void func1(){}
24 };
25
26class  E: public B, public C
27 {
28int in;
29virtual void func0(){}
30virtual void func1(){}
sizeof 指针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
⽰例⼆:含有虚继承
1class CommonBase
2 {
3int co;
4 };
5
6class Base1: virtual public CommonBase
7 {
8public:
9virtual void print1() {}
10virtual void print2() {}
11private:
12int b1;
13 };
14
15class Base2: virtual public CommonBase
16 {
17public:
18virtual void dump1() {}
19virtual void dump2() {}
20private:
21int b2;
22 };
23
24class Derived: public Base1, public Base2
25 {
26public:
27void print2() {}
28void dump2() {}
29private:
30int 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
+---

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。