Śledziłem błąd związany z użyciem __m128 (wektor SSE) jako wartości w std :: unordered_map. Powoduje to błąd segmentacji środowiska wykonawczego przy użyciu komendy mingw32 g ++ 4.7.2.STL unordered_map zawiesza się z wartościami __m128
Proszę zobaczyć przykład poniżej. Czy jest jakiś powód, dla którego to powinno zawieść? A może może istnieć obejście tego problemu? (Próbowałem owijać wartość w klasie, ale to nie pomogło.) Dzięki.
#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;
}
ustawienia kompilacji: g ++ -march = rodzimy -std = C++ 11
Niektóre pokrewne czytanie tutaj: http://stackoverflow.com/questions/4424741/aligned-types-and-passing-arguments-by-value – Joe
kiedy dereference wskaźnik do typu '__m128', wynikowe funkcje ładowania/składowania, które emituje kompilator, są zazwyczaj zrównane z odmianą, więc przyjmuje on nieodłączne założenie, że pamięć podstawowa jest dopasowywany w zależności od potrzeb (typ 16-bajtowy w tym przypadku). Zgaduję, że gdzieś w kodzie kontenera, wskaźnik do "__m128" jest dereferenced i założenia wyrównania nie trzyma, co powoduje błąd segmentacji. Jeśli uruchomisz program z debuggerem i sprawdzisz wartość wskaźnika po awarii, powinieneś być w stanie to zobaczyć. –
Czy w ogóle nie ma dostępu do niezdefiniowanego zachowania 'm [0]'? – hirschhornsalz