27

根据C++11 9.1/7 (draft n3376)标准布局类是这样的类:

  • 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,

  • 没有虚函数 (10.3) 和虚基类 (10.1),

  • 对所有非静态数据成员具有相同的访问控制(Clause11),

  • 没有非标准布局的基类,

  • 要么在派生最多的类中没有非静态数据成员,并且最多有一个具有非静态数据成员的基类,要么没有具有非静态数据成员的基类,并且

  • 没有与第一个非静态数据成员相同类型的基类。

因此空类是标准布局类;并且另一个以空类为基类的类也是标准布局类,前提是此类的第一个非静态数据成员与基类的类型不同。

此外,9.2/19指出:

指向标准布局结构对象的指针,使用 a 进行适当转换reinterpret_cast,指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。[注意:因此,标准布局结构对象中可能存在未命名的填充,但不是在其开头,这是实现适当对齐所必需的。——尾注]

这似乎意味着空基类优化现在是一种强制优化,至少对于标准布局类是这样。我的观点是,如果不强制要求空基优化,那么标准布局类的布局将不是标准的,而是取决于实现是否实现了所述优化。我的推理是正确的,还是我错过了什么?

4

1 回答 1

23

是的,你是对的,在“PODs revisited”提案中指出了这一点:http ://www.open-std.org/jtc1/sc22/WG21/docs/papers/2007/n2342.htm#ABI

Embarcadero 编译器文档也说明了这一点: http: //docwiki.embarcadero.com/RADStudio/en/Is_standard_layout

另一个关键点是[class.mem]/16

如果两个标准布局结构(第 9 条)类型具有相同数量的非静态数据成员并且相应的非静态数据成员(按声明顺序)具有布局兼容类型(3.9),则它们是布局兼容的。

请注意,只有数据成员会影响布局兼容性,而不是基类,因此这两个标准布局类是布局兼容的:

struct empty { };
struct stdlayout1 : empty { int i; };

struct stdlayout2 { int j; };
于 2012-05-28T19:42:57.883 回答