C++标准强制对内存中的类成员变量进行排序。它表示,成员变量的地址必须按声明的顺序增加,但只能在一个访问部分内。非常特别的是,这似乎并不妨碍编译器以交错的方式布局访问部分。例如:C++访问节可以交错吗?
class X {
public:
int i;
int j;
private:
int k;
int n;
}
该标准是否允许编译器按照i,k,j,n的顺序排列数据成员?这将使编译器在不违反标准的情况下优化对象布局的一些(有限)自由。
C++标准强制对内存中的类成员变量进行排序。它表示,成员变量的地址必须按声明的顺序增加,但只能在一个访问部分内。非常特别的是,这似乎并不妨碍编译器以交错的方式布局访问部分。例如:C++访问节可以交错吗?
class X {
public:
int i;
int j;
private:
int k;
int n;
}
该标准是否允许编译器按照i,k,j,n的顺序排列数据成员?这将使编译器在不违反标准的情况下优化对象布局的一些(有限)自由。
我检出了C++标准。在第9.2节,段落(或子句或其他)12中,它说:“由访问说明符分隔的非静态数据成员的分配顺序未指定。” “未指定”表示不需要记录的依赖于实现的行为。
因此,该标准明确地没有说明分配,除了我必须在j和k之前必须在n之前。因此,允许编译器按照i,k,j,n的顺序进行分配,并且不需要记录任何有关排序的信息。
不,我认为他没有试图发送垃圾邮件。这是一个有效的问题,我觉得很有意思。
好了,现在我认为编译器可以做到这一点。该标准在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).
我解释标准的方式,它看到的代码示例如下:因为有i和j之间没有访问说明符,我的地址必须拿出j的地址之前。建议的排序满足这一点。同上k和n。所以在我的解释中,编译器是允许使用这个顺序。
感谢您的回答,这是相当明确的。我想知道是否有任何编译器利用这种可能性来减少对象内的填充。 – 2012-04-07 16:37:29