虚拟继承发生时的C ++对象内存布局?

时间:2012-07-03 13:33:39

标签: visual-c++

在VC6中编译

class A 
{ 
    public: 
        int x; 
    public: 
        virtual void funA() { } 
}; 

class B : virtual public A 
{ 
    public: 
        int y; 
    public: 
        virtual void funA() { } 
        virtual void funB() { } 
}; 
sizeof(B)=20 // because of B::vptr+vbptr+B::y+A::vptr+A::x = 5*4

class A 
{ 
    public: 
        int x; 
    public: 
        virtual void funA() { } 
}; 

class B : virtual public A 
{ 
    public: 
        int y; 
    public: 
        B() {} 
        virtual void funB() { } 
}; 
sizeof(B)=20 // because of B::vptr+vbptr+B::y+A::vptr+A::x = 5*4

class A 
{ 
    public: 
        int x; 
    public: 
        virtual void funA() { } 
}; 

class B : virtual public A 
{ 
    public: 
        int y; 
    public: 
        B() {} 
        virtual void funA() { } 
        virtual void funB() { } 
}; 
sizeof(B)=24 

我无法理解,为什么它会是24 ??? 我认为他们是一样的!

1 个答案:

答案 0 :(得分:0)

基于编译后内存的快速检查,只有当B有构造函数时,才会在B和A的布局之间添加一个4字节的块/填充。我不确定是什么原因,但如果你计划复制内存,我会反对它。

没有B :: B()// 类版本2
const B ::'vftable'{代表'B'}
const B ::'vbtable'
ÿ
const B ::'vftable'{代表'A'}
X
size = 20

包括B :: B()// 类版本3
const B ::'vftable'{代表'B'}
const B ::'vbtable'
ÿ
0x00000000 // 4个字节
const B ::'vftable'{代表'A'}
X
size = 24