alignas in Strukturen auf 32-Bit-Plattformen

8

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?

    
user3809741 06.01.2016, 13:27
quelle

1 Antwort

4

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.

    
ecatmur 06.01.2016 15:53
quelle

Tags und Links