我的印象是访问union除最后一个成员之外的成员是UB,但我似乎无法找到一个可靠的参考(除了声称它是UB但没有标准支持的答案).
那么,这是不确定的行为?
我对AVX2功能上的英特尔Intrinsics有一个非常奇怪的错误,我想在这里分享.不管是我做错了什么(我现在还不能看到什么),或者库中的错误.
我在main.c中有这个简单的代码:
__int64 test = 0xFFFF'FFFF'FFFF'FFFF;
__m256i ymm = _mm256_set_epi64x(0x0000'0000'0000'0000,
0x0000'0000'0000'0000,
0x0000'0000'0000'0000,
test);
Run Code Online (Sandbox Code Playgroud)
赋给变量ymm的值是出于某种奇怪的原因:
ymm.m256i_i64[0] = 0xffff'ffff'ffff'ffff
ymm.m256i_i64[1] = 0x0000'0000'0000'0000
ymm.m256i_i64[2] = 0x0000'ffff'0000'0000
ymm.m256i_i64[3] = 0x0000'0000'0000'0000
Run Code Online (Sandbox Code Playgroud)
此时我已经调试了好几个小时,但看不出为什么ymm.m256i_i64[2]会得到这个流氓价值.请帮忙!
有趣/奇怪的事实: 如果我写这个C代码:
__m256i ymm = _mm256_set_epi64x(0x0000'0000'0000'0000,
0x0000'0000'0000'0000,
0x0000'0000'0000'0000,
0xFFFF'FFFF'FFFF'FFFF);
Run Code Online (Sandbox Code Playgroud)
然后将值正确设置为:
ymm.m256i_i64[0] = 0xffff'ffff'ffff'ffff
ymm.m256i_i64[1] = 0x0000'0000'0000'0000
ymm.m256i_i64[2] = 0x0000'0000'0000'0000
ymm.m256i_i64[3] = 0x0000'0000'0000'0000
Run Code Online (Sandbox Code Playgroud)
注意:我使用的是Visual Studio; 他们的编译器和调试工具,如下图所示:

打印代码后的printf : ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 ff ff ff 00 ff ff 00 00 …
目前我正在使用Visual C++内联汇编来使用SSE嵌入一些核心功能; 但是我认为在x64模式下不支持内联汇编.
在x64架构中构建软件时如何使用SSE?