【发布时间】:2019-07-19 14:04:42
【问题描述】:
以下所有操作都将在 GCC 9.1 上使用 Compiler Explorer 在 x86-64 中使用 -O3 完成。
我有这个代码:
struct Base {
Base() {}
double foo;
int bar;
};
struct Derived : public Base {
int baz;
};
int main(int argc, char** argv)
{
return sizeof(Derived);
}
它正确返回16,正如我所料,foo 8 个字节,bar 4 个字节和baz 4 个字节。这只是因为Derived 继承自Base,因此它不必在bar 之后填充,因为Derived 是包含Base 和Derived 元素的单一类型。
我有两个问题,如下:
第一个问题
如果我删除Base() {} 的显式构造函数,它开始返回24,而不是16。即它在bar 和baz 之后添加填充。
我无法解释为什么拥有显式默认构造函数与拥有隐式默认构造函数有什么不同。
第二个问题
如果我随后将 Base 的 struct 更改为 class,它会变回返回 16。我也无法解释这一点。为什么访问修饰符会改变结构的大小?
【问题讨论】:
-
半个 stackoverflow.com/q/47914612/560648 的欺骗。我不知道为什么更改引入 base 的关键字会有所不同(鉴于无论如何都不会进行成员重新排序,因此不应该涉及不同的成员访问级别)
-
啊,谢谢!这回答了第一个问题,但不是第二个
-
回复:“它正确地返回 16,正如我所期望的那样”——根据定义,
sizeof的结果是正确,不管你期望什么。跨度> -
嗯,是的,它是访问说明符;添加
public:。 -
@LightnessRacesinOrbit 不是错误。聚合不能有私有成员