"class members are put in ascending order"规则的原因?
Reason for the "class members are put in ascending order" rule?
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代码的兼容性,一般的排序规则不会再添加任何内容
相关文章:
- 此代码是否违反一个定义规则
- 生成文件不对文件使用隐式规则
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- 静态结构和一个定义规则
- 尽管遵循了规则,内存泄漏在哪里
- 这是关于成员访问规则的正确摘要吗
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 增强精神解析器规则以检测语句中的特殊结尾
- Ascending order c++
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- 为什么此指针值不能转换为整数的规则是什么?
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- 传递通用函数,用于梯形规则的数值积分
- C++内存模型中的确切规则阻止在获取操作之前重新排序
- 模板如何影响C++中隐式声明的规则?
- antlr 规则上下文是否可以独立于目标
- Bison/flex 在识别规则后等待输入
- 生成文件中隐式规则中的 -c 标志出错
- 单链接列表实现,规则为 3
- 指针算术规则中的"possibly-hypothetical"是什么意思?