C ++优化远离私有变量

时间:2012-11-24 12:44:24

标签: c++

ISO C ++(11)是否允许优化私有非静态类成员变量? 这可以被发现:

class X { int x; };
assert (sizeof(X) >= sizeof(int));

但我不知道有一条要求上述断言的条款。

澄清:(a)C ++标准中是否有一个确保上述断言的条款。

(b)有人能想到任何其他方法来检测x的缺失吗? [offsetof?]

(c)尽管有(a)和(b),但无论如何都允许优化?

我觉得如果类是函数的局部函数而不是其他函数,那么优化是可能的(但我希望有一个明确的引用)。

1 个答案:

答案 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 )可以进行相同的优化(以保持布局兼容性)。在任何非平凡的计划中,这似乎都是......不太可能......