具有菱形继承结构的 child class 的大小似乎很奇怪

Size of child class with diamond inheritance structure seems strange

我有 4 个 类 A、B、C、D。 B和C继承A,D继承B和C。

如果A、B、C、D没有任何成员变量,sizeof(D) returns 1(这是预期的)。 但是当B有一个整数作为成员变量时,sizeof(D)突然变成了8.

因为 sizeof(int) 是 4,所以 sizeof(D) return 不应该也是 4 吗?

class A
{
};

class B : public A
{
    int data;
};

class C : public A
{
};

class D : public B, public C
{
};

int main()
{
    sizeof(A); // 1
    sizeof(B); // 4
    sizeof(C); // 1
    sizeof(D); // 8?
}

您在 D 中有 2 个 A 个子对象,它们必须具有不同的表示。因此 sizeof(D) 上的 下限 1 + sizeof(int)

您使用的实现选择 D 的大小使得 (sizeof(D) % alignof(D)) == 0.

在完全空的情况下,您的实现是 non-conforming,因为它已将两个不同的 A 放在同一存储中。