Kann ein C ++ - Compiler Elemente in einer Struktur neu ordnen?

8

Kann ein C ++ - Compiler (speziell g ++) die internen Elemente einer Struktur umordnen?

Ich sehe ein seltsames Verhalten, bei dem ich eine Struktur habe, die etwa folgendes enthält:

%Vor%

Wenn ich dies in eine Datei schreibe, scheint die Reihenfolge von someUnsignedLongArray und someLongArray umgekehrt zu sein (dh die Elemente in someLongArray [] ) erscheinen nach someUnsignedLong und die Elemente von someUnsignedLongArray [] erscheinen nach someLong ). Ist das möglich?

Danke

Aktualisierung: Wie gewünscht, schreibe ich die Struktur folgendermaßen aus:

%Vor%

Der Vollständigkeit halber ist hier die vollständige Struktur:

%Vor%     
Lehane 27.05.2009, 16:06
quelle

2 Antworten

26

Es kann normalerweise keine Elemente neu anordnen, nein.

Eine Ausnahme ist, wenn es einen Zugriffsbezeichner gibt, der sie voneinander trennt:

%Vor%

a, b und c werden garantiert in dieser Reihenfolge gespeichert, und d, e und f werden garantiert in der Reihenfolge gespeichert. Aber es gibt keine Garantien darüber, wo a, b und c relativ zu d, e und f gespeichert sind.

Es ist noch eine Sache zu beachten, dass der Compiler so viel Padding einfügen kann, wie er möchte, auch wenn er nichts neu anordnet.

Hier ist der relevante Teil des Standards:

Abschnitt 9.2.12:

  

Nichtstatische Datenelemente von a   (Nicht-Union) -Klasse, die ohne ein deklariert wurde   dazwischenliegende Zugriffsspezifizierer sind   zugeteilt, so dass spätere Mitglieder haben   höhere Adressen innerhalb einer Klasse   Objekt. Die Reihenfolge der Zuteilung von   Nichtstatische Datenelemente getrennt durch ein   Access-Specifier ist nicht spezifiziert   (11.1) "

    
jalf 27.05.2009, 16:20
quelle
6

Es kann nicht, siehe Automated field re -Ordering in C-Strukturen, um das Auffüllen zu vermeiden und Warum optimiert GCC Strukturen nicht? für weitere Informationen.

Ich weiß nicht, was Sie mit "umgekehrt" meinen, vielleicht sollten Sie etwas Code und die Ausgabe hinzufügen.

    
tstenner 27.05.2009 16:13
quelle

Tags und Links