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

Why does even a 16-byte aligned address cause _mm_load_si128 to cause access violation?

本文关键字:mm load 访问冲突 si128 即使是 字节 对齐 地址 为什么      更新时间:2023-10-16

以下内容在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));
}

实质上,代码对齐 32 位整数,并尝试将其加载到 __m128i 类型中。_mm_load_si128要求输入地址以 16 字节对齐。_mm_loadu_si128不需要它,但两者都会导致上述代码在运行时发出访问冲突。为什么,我该如何解决它?

你忘了取x的地址:

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

此外,您没有为数据提供足够的空间,因此_mm_load_si128最终会读取超过分配的内存块的末尾。