2008-11-14 56 views
1

C++标准强制对内存中的类成员变量进行排序。它表示,成员变量的地址必须按声明的顺序增加,但只能在一个访问部分内。非常特别的是,这似乎并不妨碍编译器以交错的方式布局访问部分。例如:C++访问节可以交错吗?

class X { 
public: 
    int i; 
    int j; 
private: 
    int k; 
    int n; 
} 

该标准是否允许编译器按照i,k,j,n的顺序排列数据成员?这将使编译器在不违反标准的情况下优化对象布局的一些(有限)自由。

回答

3

我检出了C++标准。在第9.2节,段落(或子句或其他)12中,它说:“由访问说明符分隔的非静态数据成员的分配顺序未指定。” “未指定”表示不需要记录的依赖于实现的行为。

因此,该标准明确地没有说明分配,除了我必须在j和k之前必须在n之前。因此,允许编译器按照i,k,j,n的顺序进行分配,并且不需要记录任何有关排序的信息。

+0

感谢您的回答,这是相当明确的。我想知道是否有任何编译器利用这种可能性来减少对象内的填充。 – 2012-04-07 16:37:29

2

不,我认为他没有试图发送垃圾邮件。这是一个有效的问题,我觉得很有意思。

好了,现在我认为编译器可以做到这一点。该标准在9.2中说过。 P12:

Implementation alignment require- ments might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).

1

我解释标准的方式,它看到的代码示例如下:因为有i和j之间没有访问说明符,我的地址必须拿出j的地址之前。建议的排序满足这一点。同上k和n。所以在我的解释中,编译器允许使用这个顺序。