为什么C++标准特别赋予了具有不同访问说明符的类数据成员的内存布局的余地?

Pra*_*tic 6 c++ standards c++11

C++ 11标准要求在内存中为类的非静态数据成员排序,但是然后专门为具有不同访问说明符的成员划分豁免.

为什么呢?

§9.2.13

分配具有相同访问控制(第11条)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址.具有不同访问控制的非静态数据成员的分配顺序未指定(第11条).实施对齐要求可能导致两个相邻成员不能立即分配; 因此,可能需要空间来管理虚拟功能(10.3)和虚拟基类(10.1).

标准的这一部分已经出现在stackoverflow之前,但我认为它从未被解释过.

Nic*_*las 4

N2062是第一篇涉及 C++98/03 POD 定义更改的 C++ 论文。它是作为解决核心问题 568 的一种方法而编写的,该问题与 POD 和类型布局有关。它代表了导致 C++11 标准布局和简单可复制性定义的设计的开始。

然而,N2062 甚至从未考虑过定义具有不同访问控制的成员的布局。它甚至没有给出为什么实行这种限制的理由。该提案的最终版本也没有,它实际上为我们提供了简单可复制和标准布局的定义。这些提案的所有版本都将访问控制限制视为既成事实,而不是本可以改变的东西。

所有这些都表明该提案的作者至少了解一种可以根据访问控制更改成员顺序的编译器/ABI。