相邻声明的两个公共字段是否必须为;“彼此相邻”;在记忆中? 在C++中,如果我有一个类: class Foo { public: int a; char b; private: char c; };

相邻声明的两个公共字段是否必须为;“彼此相邻”;在记忆中? 在C++中,如果我有一个类: class Foo { public: int a; char b; private: char c; };,c++,memory,C++,Memory,这是否意味着在分配Foo的实例时,a必须位于内存中b的旁边 我读了一点《标准》,我发现唯一的语言是 具有相同访问权限的(非联合)类的非静态数据成员 控制权(第11条)的分配是为了使后来的成员拥有更高的控制权 类对象中的地址 所以,这种语言听起来似乎并没有排除像“a,c,b”这样的潜在顺序,而不是像你们所期望的那个样“a,b,c”甚至“c,a,b” 我搜索了术语continuous,有趣的是,该术语在标准中只出现了21次,但我觉得他们可能使用了不同的术语来描述“两个字段的排列方式使它们之间没有其他

这是否意味着在分配
Foo
的实例时,
a
必须位于内存中
b
的旁边

我读了一点《标准》,我发现唯一的语言是

具有相同访问权限的(非联合)类的非静态数据成员 控制权(第11条)的分配是为了使后来的成员拥有更高的控制权 类对象中的地址

所以,这种语言听起来似乎并没有排除像“a,c,b”这样的潜在顺序,而不是像你们所期望的那个样“a,b,c”甚至“c,a,b”


我搜索了术语
continuous
,有趣的是,该术语在标准中只出现了21次,但我觉得他们可能使用了不同的术语来描述“两个字段的排列方式使它们之间没有其他字段”的概念。您引用的一行后面的行回答了这个问题:

具有不同属性的非静态数据成员的分配顺序 访问控制未指定。实现一致性 需求可能导致两个相邻成员无法分配 紧接着彼此

因此,相邻声明的两个字段可能是“相邻的”,也可能不是“相邻的”,这取决于编译器的实现