考虑以下结构:
class Foo {
int a;
};
在 g++ 中测试,我明白了sizeof(Foo) == 4
但这是由标准保证的吗?是否允许编译器注意到a
是一个未使用的私有字段并将其从类的内存表示中删除(导致更小的 sizeof)?
我不希望任何编译器真正进行这种优化,但这个问题在语言律师讨论中突然出现,所以现在我很好奇。
C++ 标准没有定义太多有关内存布局的信息。本案的基本规则是第 4 条9 Classes
:
4 类类型的完整对象和成员子对象应具有非零大小。 [ 注意:类对象可以被赋值,作为参数传递给函数,并由函数返回(复制或移动受到限制的类对象除外;请参阅 12.8)。其他可能的运算符,例如相等比较,可以由用户定义;见13.5。 ——尾注]
不过,现在还有一个限制:标准布局类。 (没有静态元素,没有虚拟元素,所有成员具有相同的可见性)部分9.2 Class members
要求标准布局类的不同类之间具有布局兼容性。这可以防止从此类中消除成员。
对于非平凡的非标准布局类,我认为标准中没有进一步的限制。 sizeof()、reinterpret_cast() 等的确切行为是实现定义的(即 5.2.10“映射函数是实现定义的。”)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)