2

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になるのか理解できない??? 私は彼らが同じだと思います!

4

1 に答える 1

0

コンパイル後のメモリの簡単なチェックに基づいて、B にコンストラクターがある場合にのみ、B と A のレイアウトの間に 4 バイトのブロック/パッドが追加されているようです。理由はよくわかりませんが、メモリをコピーする予定がある場合は、反対することをお勧めします。

no B::B() //クラス バージョン 2
const B::'vftable'{for 'B'}
const B::'vbtable'
y
const B::'vftable'{for 'A'}
x
size = 20

B::B() を含む //クラス バージョン 3
const B::'vftable'{for 'B'}
const B::'vbtable'
y
0x00000000 // 4 バイト
const B::'vftable'{for 'A' }
×
サイズ = 24

于 2012-07-24T06:16:34.917 に答える