2014-04-05 80 views
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不需要它,但都會導致上面的代碼在運行時發出訪問衝突。爲什麼,以及如何解決它?

回答

5

你已經忘記採取x地址:

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

另外,你沒有爲數據提供足夠的空間,所以_mm_load_si128最終會讀過去分配的存儲塊的結束。

+2

更不用說16字節的負載不適合int。 –

+0

@PaulR感謝您的評論 - 我錯過了那裏未定義的行爲! – dasblinkenlight

+0

@ user3475799根據規範,16字節對齊應該足夠了。 – dasblinkenlight

相關問題