请教,c++虚继承,sizeof大小
我不明白的是 CDiamondClass1、CDiamondClass2、CDiamondSubClass1、CDiamondSubClass2这四个大小是怎么算的,请教各位。 c++ 多继承 虚继承 类
[解决办法]
CDiamondClass1 的大小等于一个size_t 再加上2个指向基类的指针。具体可参考虚基类的实现。大致是这么个道理。
[解决办法]
楼主这种不是最复杂的,能理解CSubClassV1,V2,V3为啥为8,其他均可以理解了。V1主要要多一个存储指向子类的指针,当然微软可能不是用指针,可能用偏移量表示,但是均要占用4字节。所以V1为8。大概都是这个道理
CDiamondSubClass2 这个Size为24,主要是下面的布局
[解决办法]
p1
[解决办法]
p2
[解决办法]
p3
[解决办法]
p4
[解决办法]
p5
[解决办法]
0x7
[解决办法]
[解决办法]
<--CDiamondClass1----->
------解决方案--------------------
<----CDiamondClass2---->
[解决办法]
m_val
[解决办法]
p1,p2,p3,p4,p5均是指向m_val的偏移量,或者其他的信息。就是能通过p1找到m_val
楼主可以直接用VC将变量CDiamondSubClass2变量的开始6个4byte大小的内存打出来就知道了。
最好还是看一下深度探索c++对象模型 这本书。
[解决办法]
内存布局什么的,光说是说不清楚的,还要牵扯对齐问题、虚函数表指针的位置等(这个看编译器实现)。还是直接用编译器打印看看比较清楚点。下面是用VS打印出来的:
class CBaseClass size(8):
+---
0
[解决办法]
m_val
+---
class CSubClassV1 size(16):
+---
0
[解决办法]
{vbptr}
+---
+--- (virtual base CBaseClass)
8
[解决办法]
m_val
+---
class CSubClassV2 size(16):
+---
0
[解决办法]
{vbptr}
+---
+--- (virtual base CBaseClass)
8
[解决办法]
m_val
+---
class CSubClassV3 size(16):
+---
0
[解决办法]
{vbptr}
+---
+--- (virtual base CBaseClass)
8
[解决办法]
m_val
+---
class CDiamondClass1 size(24):
+---
[解决办法]
+--- (base class CSubClassV1)
0
[解决办法]
[解决办法]
{vbptr}
[解决办法]
+---
[解决办法]
+--- (base class CSubClassV2)
8
[解决办法]
[解决办法]
{vbptr}
[解决办法]
+---
+---
+--- (virtual base CBaseClass)
16
[解决办法]
m_val
+---
class CDiamondClass2 size(32):
+---
[解决办法]
+--- (base class CSubClassV1)
0
[解决办法]
[解决办法]
{vbptr}
[解决办法]
+---
[解决办法]
+--- (base class CSubClassV2)
8
[解决办法]
[解决办法]
{vbptr}
[解决办法]
+---
[解决办法]
+--- (base class CSubClassV3)
16
[解决办法]
[解决办法]
{vbptr}
[解决办法]
+---
+---
+--- (virtual base CBaseClass)
24
[解决办法]
m_val
+---
class CDiamondSubClass1 size(24):
+---
[解决办法]
+--- (base class CDiamondClass1)
[解决办法]
[解决办法]
+--- (base class CSubClassV1)
0
[解决办法]
[解决办法]
[解决办法]
{vbptr}
[解决办法]
[解决办法]
+---
[解决办法]
[解决办法]
+--- (base class CSubClassV2)
8
[解决办法]
[解决办法]
[解决办法]
{vbptr}
[解决办法]
[解决办法]
+---
[解决办法]
+---
+---
+--- (virtual base CBaseClass)
16
[解决办法]
m_val
+---
class CDiamondSubClass2 size(48):
+---
[解决办法]
+--- (base class CDiamondClass1)
[解决办法]
[解决办法]
+--- (base class CSubClassV1)
0
[解决办法]
[解决办法]
[解决办法]
{vbptr}
[解决办法]
[解决办法]
+---
[解决办法]
[解决办法]
+--- (base class CSubClassV2)
8
[解决办法]
[解决办法]
[解决办法]
{vbptr}
------解决方案--------------------
[解决办法]
+---
[解决办法]
+---
[解决办法]
+--- (base class CDiamondClass2)
[解决办法]
[解决办法]
+--- (base class CSubClassV1)
16
[解决办法]
[解决办法]
[解决办法]
{vbptr}
[解决办法]
[解决办法]
+---
[解决办法]
[解决办法]
+--- (base class CSubClassV2)
24
[解决办法]
[解决办法]
[解决办法]
{vbptr}
[解决办法]
[解决办法]
+---
[解决办法]
[解决办法]
+--- (base class CSubClassV3)
32
[解决办法]
[解决办法]
[解决办法]
{vbptr}
[解决办法]
[解决办法]
+---
[解决办法]
+---
+---
+--- (virtual base CBaseClass)
40
[解决办法]
m_val
+---
我的编译器是8字节对齐的,你的可能是4字节对齐,所以有差异,这里仅供参考。