考虑以下代码:
class B
{
public:
int a=10;
B()
{
cout << "B() at: "<<this<<endl;
cout << "Sizeof: " << sizeof(*this) << endl;
cout <<endl<<endl;
}
};
class D1: virtual public B
{
public:
int a=20;
D1()
{
cout << "D1() at: "<<this<<endl;
cout << "Sizeof: " << sizeof(*this) << endl;
cout << *((int *) this) << endl;
cout << *((int *) this+1) << endl;
cout << *((int *) this+2) << endl;
cout << *((int *) this+3) << endl;
cout <<endl<<endl;
}
};
class D2: public D1
{
public:
int a=30;
D2()
{
cout << "D2() at: "<<this<<endl;
cout << "Sizeof: " << sizeof(*this) << endl;
cout <<endl<<endl;
}
};
当我实例化D2对象时,会给出以下输出:
B() at: 0x22ff0c
Sizeof: 4
D1() at: 0x22ff00
Sizeof: 12
4659268
20
2293652
10
D2() at: 0x22ff00
Sizeof: 16
D1的大小是12个字节,因为它包含自己的整数,从B继承的整数和指向vtable的指针?
为什么D1的空间和B空间之间存在差距? (为什么在20岁之后才出现?)
我认为D2对象的内存布局与此类似
***D2*************
* *
* ***D1***********
* * **
* * vptr **
* * int **
* ****************
* int *
* **B*************
* * **
* * int **
* ****************
* ****************
我的想象布局有什么错误吗?
使用的编译器是gcc。