3
以下編譯MSVC上沒有警告。爲什麼即使16字節對齊的地址也會導致_mm_load_si128導致訪問衝突?
#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
不需要它,但都會導致上面的代碼在運行時發出訪問衝突。爲什麼,以及如何解決它?
更不用說16字節的負載不適合int。 –
@PaulR感謝您的評論 - 我錯過了那裏未定義的行爲! – dasblinkenlight
@ user3475799根據規範,16字節對齊應該足夠了。 – dasblinkenlight