我跟蹤了使用__m128(SSE向量)作爲std :: unordered_map中的值的錯誤。 這會在mingw32 g ++ 4.7.2中導致運行時分段錯誤。STL unordered_map使用__m128值崩潰
請看下面的例子。 有沒有任何理由爲什麼這會失敗? 或者,可能有解決方法? (我嘗試在課堂中包裝價值,但它沒有幫助。) 謝謝。
#include <unordered_map>
#include <xmmintrin.h> // __m128
#include <iostream>
int main()
{
std::unordered_map<int,__m128> m;
std::cerr << "still ok\n";
m[0] = __m128();
std::cerr << "crash in previous statement\n";
return 0;
}
編譯設置: G ++ -march =本地-std = C++ 11
一些相關閱讀這裏:http://stackoverflow.com/questions/4424741/aligned-types-and-passing-arguments-by-value – Joe
當你解除引用指向「__m128」類型的指針,編譯器發出的結果加載/存儲函數通常是對齊的類型,因此它使內在的假設成爲底層內存根據需要對齊類型(在這種情況下爲16字節對齊)。我猜在容器代碼的某個地方,一個指向'__m128'的指針正在取消引用,並且對齊假設不成立,導致分段錯誤。如果您使用調試器運行程序並在崩潰後檢查指針值,則應該可以看到這一點。 –
無論如何,沒有任何訪問'm [0]'未定義的行爲? – hirschhornsalz