ISO C ++(11)是否允许优化私有非静态类成员变量? 这可以被发现:
class X { int x; };
assert (sizeof(X) >= sizeof(int));
但我不知道有一条要求上述断言的条款。
澄清:(a)C ++标准中是否有一个确保上述断言的条款。
(b)有人能想到任何其他方法来检测x的缺失吗? [offsetof?]
(c)尽管有(a)和(b),但无论如何都允许优化?
我觉得如果类是函数的局部函数而不是其他函数,那么优化是可能的(但我希望有一个明确的引用)。
答案 0 :(得分:1)
我不认为这是禁止的,但我认为这是不切实际的。
§9课程[class]
7 / 标准布局类是一个类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
- 没有虚函数(10.3),没有虚基类(10.1),
- 对所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准布局基类
- 在大多数派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有包含非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类.107
8 / 标准布局结构是使用类键
struct
或类键{{1}定义的标准布局类}。
...因此class
是标准布局结构。
§9.2班级成员[class.mem]
16 / 如果两个标准布局结构(第9类)类型具有相同数量的非静态数据成员和相应的非静态数据成员(按声明顺序),则它们是布局兼容的具有布局兼容类型(3.9)。
...因此class X { int x; };
与class X { int x; };
布局兼容。
不幸的是,标准中没有正式定义布局兼容性。但是,考虑到使用单词布局,似乎意图是声明两个布局兼容类型应该具有相同的底层表示。
因此,为了能够删除struct Y { int y; };
中的x
,必须证明布局兼容的所有结构(例如X
)可以进行相同的优化(以保持布局兼容性)。在任何非平凡的计划中,这似乎都是......不太可能......