c++ - 将 [[no_unique_address]] 与空基类继承组合时得到意外结果
问题描述
考虑以下:
struct Base {};
struct Empty {};
struct X : Base {
int i;
[[no_unique_address]] Empty e;
};
static_assert(sizeof(X) == 4);
X
继承了空Base
并获得了EBO ,并且由于它的成员e
也使用[[no_unique_address]]
了属性,这使得大小X
只有int
.
但是当我用作另一个继承空的X
结构的成员变量时,大小突然变为:Y
Base
Y
8
struct Y : Base {
X x;
[[no_unique_address]] Empty e;
};
static_assert(sizeof(Y) == 8);
是否Y
违反标准并禁止 EBO?还是这仅取决于编译器供应商的实现?
解决方案
直接引用自cppreference:
如果空基类中的一个也是第一个非静态数据成员的类型或类型的基类,则禁止空基优化,因为要求相同类型的两个基子对象在对象表示中具有不同的地址派生最多的类型。
推荐阅读
- python - 为台湾股市写python
- go - 如何优化处理大数据
- react-native - 如何在 React Native 中使用访问令牌注销
- api - 如何从 serverUrl salesforce (SFDC) 查询记录
- vbscript - 如何制作给出错误 800A03EC“文件已移动或删除”的 VBS 文件并忽略该错误?
- python - Python:做 MNLogit,输出只显示目标变量的 7 个类中的 6 个
- python - plot_confusion_matrix() 缺少 1 个必需的位置参数:'y_true'
- ios - Flutter 气泡聊天,在气泡外显示时间戳和刻度
- html - 如何在 HTML 中链接来自不同文件夹的文件?
- java - updateApp 小部件不适用于 remoteView