C++ 为什么即使是16字节对齐的地址也会导致_mm_load_si128导致访问冲突?

C++ 为什么即使是16字节对齐的地址也会导致_mm_load_si128导致访问冲突?,c++,sse,intrinsics,C++,Sse,Intrinsics,以下在MSVC上编译时没有警告 #include <iostream> #include <emmintrin.h> int main() { __declspec(align(16)) int x = 42; std::cout << &x << "\n"; // Print out the address that holds x __m128i v = _mm_load_si128((__m128i c

以下在MSVC上编译时没有警告

#include <iostream>
#include <emmintrin.h>

int main() 
{
    __declspec(align(16)) int x = 42;
    std::cout << &x << "\n";  // Print out the address that holds x

    __m128i v = _mm_load_si128((__m128i const*)(x));
}
#包括
#包括
int main()
{
__declspec(align(16))int x=42;

std::cout你忘了带
x的地址了

__m128i v = _mm_load_si128((__m128i const*)(&x));
//                                          ^
//                                          |
//                     Here ----------------+

此外,您没有为数据提供足够的空间,因此
\u mm\u load\u si128
最终将读取超过分配内存块的末尾。

更不用说16字节的加载不适合int。@PaulR感谢您的宝贵意见-我错过了未定义的行为!@user3475799根据规范,16-字节对齐应该足够了。@user3475799您所需要的就是为
x
变量分配足够的空间。您可以将其设置为四个32位
int
s的数组,如下所示:
int x[4]
注意,现在需要删除符号AND,因为
x
是一个数组,所以它的名称将被解释为表达式中的指针。