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.
不同目标拒绝属性是否是一个已知问题,或者这只是底层交叉编译目标的产物?我知道 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 似乎在追随微软的步伐。
在 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.
不同目标拒绝属性是否是一个已知问题,或者这只是底层交叉编译目标的产物?我知道 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 似乎在追随微软的步伐。