为什么只包含B类型成员变量的C类的sizeof(C)不等于sizeof(B)?

问题描述 投票:0回答:1

我写了三个类: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++ memory compiler-construction
1个回答
0
投票

如果没有填充,则以下断言为真(忽略类成员是私有的,这是不相关的):

C c;

A *a1=&c;
A *a2=&c.a;

static_assert(a1 == a2);

有两个不同的

A
对象,但如果没有填充,它们的指针将是相同的。这是不可能的。

© www.soinside.com 2019 - 2024. All rights reserved.