我遇到了一个奇怪的情况,即
alignof(__m512)
与由苹果的clang编译的std::alignment_of<__m512>::value
不相等。经过一些测试,我发现当在模板中使用T=__m512
时评估alignof(T)
,结果与直接使用alignof(__m512)
不同。我还在Ubuntu(WSL)上使用g++和非苹果的clang编译了几个测试,并得到了正确(我认为)的行为。这是苹果的clang的一个错误还是已实现行为的问题?#include <immintrin.h> //avx headers
#include <cstdio>
#include <typeinfo>
#include <type_traits>
void test_directly() {
printf("directly: typeid %s alignof %zu\n", typeid(__m512).name(), alignof(__m512));
}
template<typename T>
void test_as_template_argument() {
static_assert(std::is_same<T, __m512>::value, "assert");
printf("template: typeid %s alignof %zu\n", typeid(T).name(), alignof(T));
}
int main() {
test_directly();
test_as_template_argument<__m512>();
return 0;
}
输出(使用clang++ -std=c++17 -march=native
编译):
directly: typeid Dv16_f alignof 64
template: typeid Dv16_f alignof 32
clang的版本:
Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
macOS版本:macOS Catalina 10.15.4 (19E2269) Darwin 19.4.0
std::alignment_of<T>::value
可能与alignof(T)
不同,但这个问题可以追溯到2018年末,然而clang v11在2020年末发布。 - YSC