std :: unordered_mapの値として__m128(SSEベクトル)を使用するバグを追跡しました。 これは、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;
}
コンパイル設定:
ABIは__m128
変数が常に上に整列されていることを確認してい: G ++ -march =ネイティブ-std = C++ 11
関連記事を読む:http://stackoverflow.com/questions/4424741/aligned-types-and-passing-arguments-by-value – Joe
'__m128'型へのポインタを使用すると、コンパイラが出力する結果のロード/ストア関数は、通常、さまざまな整列されたものになります。そのため、基底のメモリ型に必要に応じて整列されます(この場合は16バイトの整列)。私は、コンテナコードのどこかで、 '__m128'へのポインタが参照解除されており、アラインメントの仮定が成立せず、セグメンテーション違反が発生していると推測しています。デバッガでプログラムを実行し、クラッシュ後にポインタ値を調べると、これを見ることができます。 –
'm [0]'未定義の動作にアクセスできません。 – hirschhornsalz