Ich verfolgt einen Fehler auf die Verwendung eines __m128 (SSE-Vektor) als Wert in einer std :: unordered_map. Das verursacht einen Laufzeitsegmentierungsfehler mit Mingw32 g ++ 4.7.2.STL unordered_map stürzt mit __m128 Werten
Bitte beachten Sie das Beispiel unten. Gibt es einen Grund, warum dies fehlschlagen sollte? Oder könnte es einen Workaround geben? (Ich habe versucht, den Wert in einer Klasse zu verpacken, aber es hat nicht geholfen.) Danke.
#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;
}
Kompilierungseinstellungen: g ++ -march = native -std = C++ 11
Einige verwandte lesen Sie hier: http://stackoverflow.com/questions/4424741/aligned-types-and-passing-arguments-by-value – Joe
Wenn Sie eine dereferenzieren Zeiger auf einen '__m128'-Typ sind die resultierenden Lade-/Speicherfunktionen, die der Compiler ausgibt, typischerweise von der ausgerichteten Vielfalt, so dass es die inhärente Annahme macht, dass der zugrundeliegende Speicher vorhanden ist wird für den Typ wie erforderlich ausgerichtet (16-Byte-Ausrichtung in diesem Fall). Ich vermute, dass irgendwo im Container-Code ein Zeiger auf ein '__m128' dereferenziert wird und die Alignment-Annahme nicht gilt, was zu einem Segmentierungsfehler führt. Wenn Sie Ihr Programm mit einem Debugger ausführen und den Zeigerwert nach dem Absturz überprüfen, sollten Sie in der Lage sein, dies zu sehen. –
Gibt es überhaupt keinen Zugriff auf 'm [0]' undefiniertes Verhalten? – hirschhornsalz