4

这是一个大问题,所以我要求提供参考而不是小册子大小的答案。我正在阅读 Stroustrup 的 C++ 之旅,似乎对象的布局方式是内存是许多 C++ 功能设计的基础,例如 POD 与聚合与具有虚拟成员的类。

不幸的是,Tour 本身并没有详细介绍这个主题,并且浏览一些标准参考资料(例如 C++ Primer 5ed 和 TCPPPL 4ed)的 ToC 并没有显示它们是否或在何处涵盖它。

4

1 回答 1

6

[class.mem]/18

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

[class.mem]/25

如果标准布局类对象有任何非静态数据成员,则其地址与其第一个非静态数据成员的地址相同。否则,其地址与其第一个基类子对象(如果有)的地址相同。[注意:因此,标准布局结构对象中可能存在未命名的填充,但不是在其开头,这是实现适当对齐所必需的。— end note ] [ 注意:对象和它的第一个子对象是指针互转换的([basic.compound],[expr.static.cast])。——尾注]

还有[dcl.array]表示数组在内存中是连续的,[class.bit]谈论位域,以及[intro.object]谈论对象大小和重叠子对象的概念。

可能还有其他地方。没有一处。

于 2018-06-11T21:05:13.550 回答