【发布时间】:2023-04-04 04:18:01
【问题描述】:
C++11 标准要求对类的非静态数据成员在内存中进行排序,但随后明确规定了对具有不同访问说明符的成员的豁免。
为什么?
§ 9.2.13
分配具有相同访问控制(第 11 条)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址。 未指定具有不同访问控制的非静态数据成员的分配顺序(第 11 条)。 实现对齐要求可能会导致两个相邻的成员不会被紧随其后地分配;管理虚拟功能 (10.3) 和虚拟基类 (10.1) 的空间要求也是如此。
这部分标准之前已经在stackoverflow上提出过,但我认为它从未被解释过。
【问题讨论】:
-
大多数布局与 C 兼容性有关。为了更广泛的保证而收紧;作为一种猜测,也许有一个编译器可以按公共/私人/受保护的环境进行排序?还有其他没有的?
-
@Yakk 看起来确实不可能有“深层”原因,它只是为了描述原始标准化时的现有编译器。另一方面,这部分标准被巧妙地更改为 C++11,这完全是莫名其妙的。
-
它比 C++11 更古老,一直追溯到 C++98(尽管略有改写)。 IMO 按可访问性分组只是提高参考局部性的一种非常便宜的方法,对于有效使用处理器缓存非常重要。