首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问,c++虚继承,sizeof大小

2013-10-04 
请教,c++虚继承,sizeof大小我不明白的是 CDiamondClass1、CDiamondClass2、CDiamondSubClass1、CDiamondSubCl

请教,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字节对齐,所以有差异,这里仅供参考。

热点排行