C++中[[no_unique_address]]的处理方式是否属于实现定义行为?
[[no_unique_address]]的布局处理确实属于实现定义行为,你观察到的不同输出差异完全符合C++标准要求,原因如下:
- C++标准仅赋予
[[no_unique_address]]属性“允许被标记的非静态数据成员与其他地址不冲突的成员共享地址”的语义,没有强制要求编译器必须执行对应的空间优化,是否执行优化由编译器自行决定。 - 你给出的示例中,两个同类型的
Empty成员e1、e2受C++“同类型完整对象必须拥有不同地址”的规则约束,本身不能共享地址。要实现sizeof(W) == 2,需要编译器将e1与c[0]、e2与c[1]分别重叠排布,这种多成员交叉重叠的优化目前GCC、Clang均未实现,因此实际运行输出为false,而部分支持该优化的编译器场景下则会输出true,两种输出均符合标准要求。
注:文档中标注的是符合标准的可能输出,而非所有编译器的统一输出。
内容的提问来源于stack exchange,提问作者xmllmx
相关产品推荐
相关产品推荐

