The answer is:
size of A1 is = 1
size of B1 is = 1
size of B2 is = 1
size of B3 is = 4
size of C1 is = 8
size of A2 is = 4
size of B4 is = 4
size of B5 is = 8
size of B6 is = 4
size of B7 is = 4
size of C2 is = 8
size of C3 is = 8
size of C4 is = 12
size of C5 is = 4
size of C6 is = 4
size of D1 is = 8
1. 一个空类对象的大小(A1的size)不是0,而是1
这是这个字节是被编译器安插进去的一个字节,这样就使得这个空类的两个实例得以在内存中配置独一无二的地址。
2. 包含有virtual function的类的对象size至少是4字节(VPTR)
3. 对齐方式
复合数据类型里占用字节最多的元素与CPU对齐字节数中较小的一个,例子就是C1有int和char,size是8(两个int的大小)
4. 虚继承本质是有一个virtual base class table. 这个table一般是和virtual function table合并在一起的。
所以对于Class B6来说是以下的布局。
B6
---- A2 object's address [-1]
_vptr --> type info [0]
---- ~B6()'s address [1]
所以B6和B4一样大。
5. 多重继承中,多个vtpr table, 子类的table与其中的一个virtual function table 合并,
所以D1的size是8,其中table _vtpr_C5是D1和C5共享的。
布局如下。
------ A2s object address [-1]
_vtpr_C5---- type info [0]
~C's address [1]
------
A2s object address [-1]
_vtpr_C6 ---- type info [0]
~C address [1]
------
Thanks for the detail description from Sunny.
本文通过一系列C++类定义及实例化过程,探讨了不同类结构(包括空类、含虚拟函数的类、复合数据类型类及虚继承类等)在内存中的实际占用大小,并解释了这些大小背后的原因,如编译器对空类的处理、虚函数指针的占用以及虚继承带来的变化。
1484

被折叠的 条评论
为什么被折叠?



