类/结构成员总是按照它们被声明的顺序在内存中创建吗?

Jas*_*ker 41 c++ memory memory-alignment

这是Rob Walker 在这里回答的问题.

假设我声明一个类/结构,如下所示:

struct
{ 
    char A;
    int B;
    char C;
    int D;
};
Run Code Online (Sandbox Code Playgroud)

是否可以安全地假设这些成员将在内存中以完全相同的顺序声明,或者这是否依赖于编译器?我问,因为我一直认为编译器可以随心所欲地做任何事情.

这导致了我的下一个问题.如果上面的例子导致内存对齐问题,为什么编译器不能只是隐式地将它变成这样的东西:

struct
{ 
    char A;
    char C;
    int B;
    int D;
};
Run Code Online (Sandbox Code Playgroud)

(我主要是询问C++,但我也有兴趣听到C答案)

相关话题

aib*_*aib 72

C99§6.7.2.1第13条规定:

在结构对象中,非位字段成员和位字段所在的单元具有按声明顺序增加的地址.

并继续谈论填充和地址.C89等效部分是§6.5.2.1.

C++有点复杂.在1998年和2003年的标准中,有第9.2条第12款(C++ 11第15条):

声明没有插入访问说明符的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址.由访问说明符分隔的非静态数据成员的分配顺序未指定(11.1).实施对齐要求可能导致两个相邻成员不能立即分配; 因此,可能需要空间来管理虚拟功能(10.3)和虚拟基类(10.1).

  • C++ 11:现在是§9.2第15条:该段的措辞没有改变. (3认同)