这是一个很大的问题,所以我要求参考而不是小册子大小的答案。我正在经历Stroustrup的C ++之旅,似乎对象的布局方式是内存是许多C ++特性设计的基础,例如: PODs与聚合对比具有虚拟成员的类。
不幸的是,Tour本身并没有详细介绍这个主题,并且略读一些标准引用的ToC,例如C ++ Primer 5ed和TCPPPL 4ed,并没有显示它们是否覆盖它或者它们在何处覆盖它。
答案 0 :(得分:4)
分配具有相同访问控制的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址。未指定具有不同访问控制的非静态数据成员的分配顺序。实施对齐要求可能导致两个相邻成员不能立即分配;因此,可能需要空间来管理虚拟功能和虚拟基类。
如果标准布局类对象具有任何非静态数据成员,则其地址与其第一个非静态数据成员的地址相同。否则,其地址与其第一个基类子对象的地址(如果有)相同。 [注意:因此,在标准布局结构对象中可能存在未命名的填充,但不是在其开头,以实现适当的对齐。 - end note] [注意:对象及其第一个子对象是指针可互换的([basic.compound],[expr.static.cast])。 - 结束说明]
还有[dcl.array]表示数组在内存中是连续的,[class.bit]表示位字段,[intro.object]表示对象大小和重叠子对象的概念。
可能还有其他地方。没有一个地方。