首页 文章

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

提问于
浏览
6

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

为什么呢?

§9.2.13

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

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

1 回答

  • 2

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

    然而,N2062甚至从未考虑使用不同的访问控制来定义成员的布局 . 它甚至没有说明为什么这种限制到位的理由 . the final version of that proposal也没有,它实际上给了我们简单的可复制和标准布局定义 . 这些提案的所有版本都将访问控制限制视为既成事实,而不是可能已更改的内容 .

    所有这些都表明该提案的作者知道至少有一个编译器/ ABI根据访问控制改变了成员的顺序 .

相关问题