C++20 [[no_unique_address]] 不适用于 clang 的 win32-coff 目标

C++20 [[no_unique_address]] not working with clang's win32-coff target

在 C++20 中使用 clang-13 时,我注意到 x86_64-pc-win32-coff 交叉编译目标似乎完全拒绝了 [[no_unique_address]] 属性。我测试过的其他目标也支持此属性。

考虑这个最小的例子:

struct bar {};

struct foo {
    [[no_unique_address]] bar b;
};

当使用 -target=x86_64-pc-win32-coff 编译时,生成

<source>:4:7: warning: unknown attribute 'no_unique_address' ignored [-Wunknown-attributes]
    [[no_unique_address]] bar b;
      ^~~~~~~~~~~~~~~~~
1 warning generated.

Live Example

不同目标拒绝属性是否是一个已知问题,或者这只是底层交叉编译目标的产物?我知道 MSVC 历史上没有进行空基优化并保留它是为了 ABI 兼容性;这是这种兼容性的产物吗?

怀疑 这可能是目标中的错误,因为它不完全满足 C++20 规范,但我不确定是否有实用的或当其他交叉编译目标似乎没有问题时,为什么这个属性被完全拒绝的已知原因。

no_unique_address 的主要支持必须在 ABI 级别处理。 Itanium ABI 和 Microsoft 的 de-facto ABI(又名:无论 MSVC 做什么)都支持 no_unique_address...有点。

你看,微软目前不愿意造成 ABI 中断。由于该属性在 C++17 构建下不执行任何操作,这意味着为 C++17 和 C++20 编译相同的 header 可能会导致 ODR 违规。

因此,他们推迟完全实施该属性。他们已经准备好代码进入编译器(您甚至可以使用 MSVC-specific 属性 msvc::no_unique_address 来获得相同的效果)。但在他们进行 ABI 中断之前,他们不打算支持它。

因此,Clang 似乎在追随微软的步伐。