Ich erhalte unerwartete Ergebnisse, wenn ich den folgenden Code für 32-Bit-x86-Linux ausführe (Compiler-Flags: g ++ -std = c ++ 14-m32). Ich habe versucht, gcc und klingeln.
%Vor%Die Ausgabe ist:
%Vor%Was passiert hier? Warum sind S1 und S2 unterschiedlich groß? Wie ich es verstehe, sind 64-Bit-Integer-Werte auf 32-Bit-x86-Maschinen auf 32 Bit ausgerichtet. Dies erklärt, warum die Größe von S1 12 Bytes beträgt. Aber warum gilt das nicht für S2?
Das Schlüsselwort alignof
misst die Ausrichtung eines Typs als vollständiges Objekt. d.h. wenn es als einzelnes Objekt oder Array-Element zugewiesen ist. Dies entspricht nicht unbedingt den Ausrichtungsanforderungen dieses Typs als Unterobjekt. Werden Mitglieder einer POD-Struktur oder Standard-Layout-Art garantiert nach ihren Ausrichtungsanforderungen ausgerichtet?
Die Ausrichtung einer 64-Bit-Ganzzahl in einer Struktur wird von der x386 ABI bei 4 Bytes vorgeschrieben; GCC ist nicht in der Lage, dies zu ändern, da dies die Binärkompatibilität mit anderen Objektdateien und Programmen beeinträchtigen würde. Es kann jedoch ganze 64-Bit-Ganzzahlobjekte auf 8 Byte ausrichten, da dies die ABI nicht beeinflusst und einen effizienteren Zugriff auf den Speicher ermöglicht.