首页 > 解决方案 > 将 [[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结构的成员变量时,大小突然变为:YBaseY8

struct Y : Base {
  X x;
  [[no_unique_address]] Empty e;
};

static_assert(sizeof(Y) == 8);

是否Y违反标准并禁止 EBO?还是这仅取决于编译器供应商的实现?

标签: c++c++20

解决方案


直接引用自cppreference

如果空基类中的一个也是第一个非静态数据成员的类型或类型的基类,则禁止空基优化,因为要求相同类型的两个基子对象在对象表示中具有不同的地址派生最多的类型。


推荐阅读