我写了三个类:A、B、C,A没有成员变量,B有整型成员变量,C有B类型的成员变量,如下所示:
class A {
public:
};
class B : public A{
private:
int value_;
};
class C : public A{
private:
B a;
};
令我惊讶的是,sizeof(C) 是 8,而不是 4,正如 sizeof(B) 所预期的那样。 我曾认为这可能是由于填充造成的,但是当我删除从 A 继承的 C 或从 A 继承的 B 时,sizeof(C) 正如预期的那样变成了 4。 当使用 GCC 和 Clang 时,我在 64 位机器上观察到相同的行为。
我想知道为什么编译器在编译C时会额外增加4个字节的存储开销。
如果没有填充,则以下断言为真(忽略类成员是私有的,这是不相关的):
C c;
A *a1=&c;
A *a2=&c.a;
static_assert(a1 == a2);
有两个不同的
A
对象,但如果没有填充,它们的指针将是相同的。这是不可能的。