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.