Normalerweise arbeite ich mit 3D-Vektoren mit folgenden Typen:
%Vor%Initialisierung von Vektoren mit etw. wie:
%Vor%und Zugriff auf sie mit etw. wie:
%Vor%Jetzt brauche ich eine Vektor-Arithmetik mit SSE-Anweisungen. Ich habe folgenden Code:
%Vor%GCC unterstützt solche Art und Weise. Aber... Zuerst gibt es mir 0,00000 als Ergebnis. Zweitens kann ich nicht auf die Elemente solcher Vektoren zugreifen. Meine Frage ist: Wie kann ich auf Elemente solcher Vektoren zugreifen? Ich brauche etwas. wie eine [0], um auf ein X-Element zuzugreifen, eine [1], um auf ein Y-Element usw. zuzugreifen.
PS: Ich kompiliere diesen Code mit:
%Vor%Der sichere und empfohlene Weg, um auf die Elemente zuzugreifen, ist eine Union, anstelle eines Pointer-Punnings, der die Aliasing-Erkennungsmechanismen des Compilers täuscht und zu instabilem Code führen kann.
%Vor%
Beachten Sie, dass gcc 4.6 jetzt indizierte Vektoren unterstützt:
In C können Vektoren so subskribiert werden, als wäre der Vektor ein Array mit der gleichen Anzahl von Elementen und dem gleichen Basistyp. Ungebundene Zugriffe rufen zur Laufzeit undefiniertes Verhalten auf. Warnungen für außerhalb der Grenzen liegende Zugriffe auf Vektor-Subskriptionen können mit -Warray-Grenzen aktiviert werden.
Sie vergessen, dass Sie a
als Array von Floats neu interpretieren müssen. Der folgende Code funktioniert ordnungsgemäß:
P.S .: Danke für diese Frage, ich wusste nicht, dass gcc solche SSE-Unterstützung hat.
UPDATE: Diese Lösung schlägt fehl, sobald die Arrays nicht mehr ausgerichtet sind. Die Lösung von @drhirsh
ist frei von diesem Problem.