首先,平时所声明的类只是一种类型定义,它本身是没有大小可言的。 因此,如果用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
+---
原文链接: https://www.cnblogs.com/easonpan/archive/2012/04/25/2470177.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/48473
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!