空基类优化现在是强制优化吗(至少对于标准布局类)
Is the Empty Base Class Optimization now a mandatory optimization (at least for standard-layout classes)?
根据 C++119.1/7(草案 n3376),标准布局类是具有以下特征的类:
因此,空类是标准布局类
没有非标准布局类(或此类类型的数组)类型的非静态数据成员或引用,
没有虚函数(10.3)也没有虚拟基类(10.1),
对所有非静态数据成员具有相同的访问控制(条款 11),
- 在派生最多的类中没有非静态数据成员,最多有一个具有非静态数据成员的基类,
没有非标准布局基类,
或者没有具有非静态数据成员的基类,并且
没有与第一个非静态数据成员类型相同的基类。
;另一个以空类为基的类也是标准布局类,前提是该类的第一个非静态数据成员与基的类型不同。
此外,第9.2/19号文件指出:
指向标准布局结构对象的指针,使用
reinterpret_cast
进行适当转换,指向其初始成员(或者,如果该成员是位字段,则指向它所在的单元),反之亦然。[注意:因此,标准布局结构对象中可能存在未命名的填充,但不是在其开头,这是实现适当对齐所必需的。
这似乎意味着空基类优化现在是强制性优化,至少对于标准布局类是这样。我的观点是,如果空基础优化不是强制性的,那么标准布局类的布局将不是标准的,而是取决于实现是否实现了所述优化。我的推理是否正确,还是我错过了什么?
是的,你是对的,这是在"重新审视 POD"提案中指出的: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; };
- FBString 的小字符串优化是否依赖于未定义的行为?
- 标准库中是否有相当于 Rust 的 'std::mem::d rop' 的C++?
- 应用于整型类型的编译时优化 'std::isfinite()'
- 如何优化标准::设置交集算法(C++)
- 优化将标准::uint32_t插入到标准::向量<char>中
- 尾部调用优化是否适用于此功能?
- 关于循环变量优化的标准合规行为是什么?
- clang实现char8_t的方式是否存在缺陷,或者标准的某个黑暗角落是否禁止优化?
- 什么是提升等价于标准::可选空选项
- 在全局命名空间中重载不依赖于用户定义类型的标准定义类型的运算符是否格式正确?
- 优化标准::位集与noexcept
- 是否有标准的C++函数,类似于地址运算符&?
- C++对间接运算符的标准描述是否保证内存写入不会被优化掉
- C++标准库容器相对于所包含对象的线程安全性
- 我想知道哪个是对应于以下链接的C++标准草案编号
- 为什么std::unique_ptr比标准指针慢得多..在优化之前
- C# String.Format with Parameters 标准等效于 C++
- 空基类优化现在是强制优化吗(至少对于标准布局类)
- C++将标准库算法应用于函数
- 定义一个行为类似于标准c++数据类型的新数据类型