Ausgerichtetes Speicher- und Standardlayout

9

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.

%Vor%

Ist das legal? Kann ich damit Einschränkungen von Standard-Layout-Typen umgehen?

    
bluescarni 12.12.2013, 18:15
quelle

3 Antworten

1

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.

    
Quuxplusone 04.03.2014 00:07
quelle
0

Versucht in der XCode C ++ 11 Compiler-Option von OSX und scheint für mich zu funktionieren. Natürlich möchten Sie wahrscheinlich ":: new (static_cast (& amp; f.m_storage)) bar ();" in foo's Konstruktor und rufen seinen Destruktor in foo's Destruktor auf.

    
DavidN 31.12.2013 15:54
quelle
0

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.

    
Jens Munk 28.01.2014 22:33
quelle

Tags und Links