C ++访问部分可以交错吗?

时间:2008-11-14 09:11:58

标签: c++

C ++标准对内存中的类成员变量进行了排序。它表示成员变量的地址必须按声明的顺序增加,但仅限于一个访问部分。非常具体地说,这似乎并不妨碍编译器以交错的方式布置访问部分。例如:

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

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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).

答案 2 :(得分:1)

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