"class members are put in ascending order"规则的原因?

Reason for the "class members are put in ascending order" rule?

本文关键字:规则 order ascending class members are put in      更新时间:2024-05-10

C++98具有以下规则:

如果两个指针指向同一对象的非静态数据成员,或指向的子对象或数组元素这样的成员,递归地,指向后面声明的成员的指针比较大,前提是成员不是用访问说明符标签(11.1(分隔的,前提是它们的类不是并集。

这指定成员应按升序排列,前提是没有插入的访问说明符。

后来,这个规则在C++11中变得更加严格:

如果两个指针指向同一对象的非静态数据成员,或指向子对象或数组元素对于这样的成员,递归地,如果两个成员具有相同的访问控制(第11条(,前提是它们的类不是并集。

这里,具有相同访问说明符的所有成员都应该按升序排列。

我有两个问题:

  • 为什么C++11中的规则变得更加严格
  • 为什么我们一开始就有这个规则?对于标准布局类,这个规则是有意义的。但是它对非标准布局类有用吗?一个明显的缺点是,编译器不允许自由地对所有成员重新排序,因此类可能占用更少的空间(如果通过减少对齐来对数据成员进行排序,则可以减少填充(

我不认为第二个更严格。第一个是

"不被访问说明符标签分隔"显然意味着"具有相同的访问控制"。

但是,同一类中可能有两个成员,它们都由一个访问说明符分隔,即:

public:
int m1;
public:
int m2;

第一个子句未被验证,但第二个子句被验证。因此第一个子句的限制性更强。

因此,第一个规范更符合句法,第二个规范更具语义。

第二种方法还允许编译器按访问类别重新排列成员,从而使其按访问类别具有一些"全局"布局策略,即一个块用于私有,另一个用于受保护,第三个用于公共。

这里引用了注释C++参考手册,第242页:

要求未被访问说明符标签分隔的成员按照声明的顺序分配,这提供了与现有C代码的兼容性。

似乎在1990年,POD概念还没有发明出来,而且这个规则提供了与C代码的兼容性。

但我想知道,C++98(它有POD概念(为什么仍然对所有类型的类都有排序规则。POD旨在提供与C代码的兼容性,一般的排序规则不会再添加任何内容