【发布时间】:2021-04-14 06:29:28
【问题描述】:
#include <iostream>
using namespace std;
class A {
int a;
};
class B1 : virtual public A {
int b1;
};
class B2 : virtual public A {
int b2;
};
class C : public B1, public B2 {
int c;
};
int main() {
A obj1; B1 obj2; B2 obj3; C obj4;
cout << sizeof(obj1) << endl;
cout << sizeof(obj2) << endl;
cout << sizeof(obj3) << endl;
cout << sizeof(obj4) << endl;
return 0;
}
输出:
4
16
16
40
在上面的c++程序中, A 的大小为 4,因为它只有一个 int B1 的大小为 16,因为 (int+ int + virtual pointer) B2 相同
但是C的大小怎么是40???
【问题讨论】:
-
可以有对齐和填充
-
@drescherjm 一切都是
int。有什么要对齐或填充的? -
@Spencer 可能这是 x64 架构,所以
vptr是 8 个字节。 -
@Spencer vptr 可能是 8 个字节。
-
40 = 16 + 16 +
sizeof(int)+ 填充为 8 的倍数以满足指针的对齐要求。
标签: c++ multiple-inheritance virtual-inheritance memory-layout