Das Übergeben von ausgerichteten Typen oder Strukturen mit ausgerichteten Typen nach Wert funktioniert bei einigen Implementierungen nicht. Dies bricht STL-Container, da einige Methoden (z. B. die Größenänderung) ihre Argumente nach Wert übernehmen.Ausgerichtete Typen und Übergabe von Argumenten nach Wert
Ich führe einige Tests mit Visual Studio 2008 aus und bin nicht ganz sicher, wann und wie der Wertübergabe-Wert fehlschlägt. Mein Hauptanliegen ist Funktion foo. Es scheint gut zu funktionieren, aber könnte es ein Ergebnis von Inlining oder einem anderen Zufall sein? Was passiert, wenn ich die Signatur in void foo (const __m128 &) ändere?
Ihre Eingabe wird sehr geschätzt. Vielen Dank.
struct A
{
__m128 x;
int n;
};
void foo(__m128);
void bar(A);
void f1()
{
// won't compile
// std::vector<A> vec1(3);
// compiles, but fails at runtime when elements are accessed
std::vector<__m128> vec2(3);
// this seems to work. WHY???
std::vector<__m128, some_16_byte_aligned_allocator<__m128> > vec3(3);
__m128 x;
A a;
// passed by value, is it OK?
foo(x);
// won't compile
//bar(a);
}
BEARBEITEN. STL schlägt selbst mit Alignator fehl, da das Problem der Weitergabe nach dem Wert bestehen bleibt.
diesen Link gefunden pass __m128 by value
Was sind die Kompilierungsfehler/Warnungen, die Sie bekommen? Ich nehme an, etwas wie "formale Parameter ... wird nicht ausgerichtet"? – celion
Das ist, was ich bekomme. Fehler C2719: Unnamed-Parameter: Formaler Parameter mit __declspec (align ('16 ')) wird nicht ausgerichtet – watson1180
In x64 unterstützen Funktionsargumente 16-Byte-Ausrichtung, so dass dieses Problem verschwindet. Ich weiß, dass das nicht dein unmittelbares Problem löst, aber hey, es ist marginal besser als nichts. ;) – jalf