班级成员重新排序

时间:2018-10-11 18:14:17

标签: c++ c++11 visual-c++ g++ clang++

最近,我读到了有关编译器对类中的成员进行排序的能力。从C ++ 11标准开始:

§9.2.13

  

[...]未指定具有不同访问控制的非静态数据成员的分配顺序。

我想知道它在实践中的样子。主要编译器(我对g ++,clang和msvc感兴趣)是否在某些情况下对类成员进行重新排序?

如果否,是否还会发生其他事情,从而导致不同的编译器上的对象布局不同(或使用不同的编译器标志时)? 假设没有使用任何虚拟方法,因此没有创建vtable。

1 个答案:

答案 0 :(得分:3)

问题实际上是有争议的。确保类的布局符合您的期望的唯一符合标准的方法是,确保该类是Standard Layout Type,这将确保每个一致性编译器上的布局相同。

这种类型的要求之一是所有成员都具有相同的访问控制。