C++标准是否保证未使用的私有字段会影响sizeof?

hug*_*omg 12 c++ sizeof language-lawyer

考虑以下结构:

class Foo {
    int a;
};
Run Code Online (Sandbox Code Playgroud)

用g ++进行测试,我得到了,sizeof(Foo) == 4但标准是否有保证?是否允许编译器注意到这a是一个未使用的私有字段并将其从类的内存中表示中删除(导致较小的sizeof)?

我不希望任何编译器实际上进行那种优化,但这个问题突然出现在语言律师讨论中,所以现在我很好奇.

joh*_*nes 3

C++ 标准没有定义太多有关内存布局的信息。本案的基本规则是第 4 条9 Classes

\n\n
\n

4 类类型的完整对象和成员子对象应具有非零大小。[ 注意:类对象可以被赋值,作为参数传递给函数,并由函数返回(复制或移动受到限制的类对象除外;请参阅 12.8)。其他可能的运算符,例如相等比较,可以由用户定义;见13.5。\xe2\x80\x94 尾注]

\n
\n\n

不过,现在还有一个限制:标准布局类。(没有静态元素,没有虚拟元素,所有成员具有相同的可见性)节9.2 Class members要求标准布局类的不同类之间的布局兼容性。这可以防止从此类中消除成员。

\n\n

对于非平凡的非标准布局类,我认为标准中没有进一步的限制。sizeof()、reinterpret_cast() 等的确切行为是实现定义的(即 5.2.10“映射函数是实现定义的。”)。

\n