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%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) "
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.