Betrachten Sie den folgenden C ++ 11-Code:
%Vor% bar
ist aufgrund der virtuellen Funktion do_bar()
kein Standardlayout. % Co_de% ist jedoch ein Standardlayout, da der von foo
bereitgestellte Typ ein POD-Typ ist und std::aligned_storage
alle anderen Anforderungen für Standardlayouttypen erfüllt.
Was passiert dann, wenn ich den foo
Speicher mit dem Placement m_storage
verwende, um eine Instanz von new
zu erstellen? Z. B.
Ist das legal? Kann ich damit Einschränkungen von Standard-Layout-Typen umgehen?
Hier ist wieder dein Code:
%Vor% Das ist in Ordnung. struct foo
ist ein Standardlayouttyp, und bei einer Instanz foo myFoo
können Sie ein Objekt vom Typ bar
in myFoo.m_storage
erstellen.
Dies ist jedoch völlig sinnlos von der POV des Compilers, also warum sich damit beschäftigen? Wie @dyp in den Kommentaren weise sagte: "Warum wollen Sie foo als Standard-Layout verwenden?"
Sie haben etwas über Gewerkschaften erzählt. Nun, das ist in Ordnung. Sie können dies schreiben:
%Vor%Allerdings kann man natürlich auch nicht erwarten, dass das funktioniert:
%Vor%Mit anderen Worten, Sie können dem Compiler lügen (via type-punning und reinterpret_cast), aber das macht Ihre Lügen nicht wahr. ;)
Siehe auch: XY-Problem.
Beim Arbeiten mit ausgerichteten Mengen
1) Es empfiehlt sich, die Ausrichtung für die Klasse oder Struktur mit declspec (align (16)) oder __attribute ((aligned (16))) anzugeben. Ich habe einige Fehler beim Aktivieren der Optimierung mit VS2010 festgestellt, als ich dies nicht getan habe.
2) Ich vermeide es normalerweise, neue zu überladen und benutze den Platzierungsoperator wie du es vorschreibst, z. B.
%Vor%3) Eine gute Faustregel besteht darin, ausgerichtete Mengen am Anfang Ihrer Struktur oder Klasse zu platzieren. Auf diese Weise führt der Compiler keine Zero-Padding zwischen den Elementen aus und warnt davor.