首页 文章

空基类优化现在是强制优化(至少对于标准布局类)?

提问于
浏览
26

根据 C++11 9.1 / 7(草案n3376),标准布局类是一个类:

没有类型为非标准布局类(或此类型的数组)或引用的非静态数据成员,没有虚函数(10.3)且没有虚基类(10.1),具有相同的访问控制(Clause11)对于所有非静态数据成员,没有非标准布局基类,在最派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有基类非静态数据成员,并且没有与第一个非静态数据成员相同类型的基类 .

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

此外,9.2 / 19指出:

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

这似乎暗示空基类优化现在是强制优化,至少对于标准布局类是这样 . 我的观点是,如果没有强制执行空基本优化,那么标准布局类的布局将不是标准的,而是取决于实现是否实现所述优化 . 我的推理是正确的,还是我错过了什么?

1 回答

  • 22

    是的,你是对的,"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; };
    

相关问题