【问题标题】:Why does the C++ standard specifically grant leeway regarding memory layout of class data members with different access specifiers?为什么 C++ 标准特别为具有不同访问说明符的类数据成员的内存布局提供余地?
【发布时间】: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 按可访问性分组只是提高参考局部性的一种非常便宜的方法,对于有效使用处理器缓存非常重要。

标签: c++ c++11 standards


【解决方案1】:

N2062 是第一篇处理 C++98/03 的 POD 定义更改的 C++ 论文。它是作为解决 core issue 568 的一种方法编写的,它是关于 POD 和类型布局的。它代表了设计的开始,导致了 C++11 的标准布局和琐碎的可复制性定义。

然而,N2062 甚至从未考虑定义具有不同访问控制的成员的布局。它甚至没有说明为什么会有这种限制。 the final version of that proposal 也没有,它实际上为我们提供了可简单复制和标准布局的定义。这些提案的所有版本都将访问控制限制视为既成事实,而不是可以改变的东西。

所有这些都表明提案的作者至少知道一种编译器/ABI,它可以根据访问控制改变成员的顺序。

【讨论】:

    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2015-12-24
    • 2017-05-31
    • 2013-10-22
    相关资源
    最近更新 更多