您的位置:首页 > 编程语言 > C语言/C++

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

2012-07-14 09:40 274 查看

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

/article/5415990.html

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

  

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

空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同);
一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的;
因此一个对象的大小≥所有非静态成员大小的总和;
当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable;

虚承继的情况:由于涉及到虚函数表和虚基表,会同时增加一个(多重虚继承下对应多个)vfPtr指针指向虚函数表vfTable和一个vbPtr指针指向虚基表vbTable,这两者所占的空间大小为:8(或8乘以多继承时父类的个数);

在考虑以上内容所占空间的大小时,还要注意编译器下的“补齐”padding的影响,即编译器会插入多余的字节补齐;

类对象的大小=各非静态数据成员(包括父类的非静态数据成员但都不包括所有的成员函数)的总和+ 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
+---




分类:
C/C++
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: