我发现这个程序的编译器之间存在一些不一致,
struct A {
};
struct B : public A {
float m;
};
struct C : public A {
B b;
float n;
};
struct D : public A {
float n;
B b;
};
static_assert(sizeof(A) == 1, "");
static_assert(sizeof(B) == 4, "");
static_assert(sizeof(C) == 8, ""); // most compilers say this is 12
static_assert(sizeof(D) == 8, "");
大多数编译器断言 sizeof(C) == 8 说 sizeof(C) 实际上是 12。我发现的唯一编译器没有并说它是 8 是 Microsoft Visual Studio 2010。
比我更聪明的人告诉我的原因是,在 B 中有两个单独的 A 引用需要保留彼此不同的单独偏移量。首先,从 C 派生的 A 在偏移量 0 处,并且成员 b 内的第二个 A 不能与第一个 A 在 0 处的偏移量相同,因此插入了 4 个字节的填充。
由于大多数编译器已经实现了这种行为,我想知道你需要什么情况来确保两个 A 有不同的引用?寻找一些关于为什么会这样的直觉?
有人说这可能是标准要求的条件,我们很好奇这是什么原因?
谢谢