Speicherausrichtung __Attribut __ ((aligned (8)))

8

Ich habe ein Programm in einem Buch

%Vor%

wenn ich es auf Cygwin auf Windows 7 Maschine installiert ausführen. Ich bekomme Ausgabe

  

2280712 2280716 2280720 16

Warum diese Ausgabe bekomme ich? Ich habe die Ausgabe erwartet

  

2280712 2280720 2280721 13

    
user555735 28.12.2010, 07:25
quelle

3 Antworten

14

A sizeof ist immer ein Vielfaches der größten Ausrichtung, da es tatsächlich "Schritte" in Zeichen im Array eines gegebenen Typs meldet, die ein Padding zwischen Elementen enthalten, so dass zwischen Arrayelementen, die zum Ausrichten benötigt werden, ein Padding ausgeführt wird.

Das Speicherlayout von struct data sieht folgendermaßen aus:

%Vor%
  • a hat den Offset 0, was offensichtlich ein Vielfaches von 8 ist;
  • ch ist bei Offset 4, was (auch offensichtlich) ein Vielfaches von 1 ist;
  • s ist bei Offset 8, was ein Vielfaches von 4 ist;
  • sizeof(struct data) entspricht dem Offset von [1] (16), der ein Vielfaches von max(8,1,4) = 8 sein muss
Vovanium 28.12.2010 09:22
quelle
11

Das aligned(N) -Attribut richtet das aktuelle -Datenelement auf eine Adresse ein, die ein Vielfaches von N ist, indem Fülldaten vor eingefügt werden. Sie scheinen zu erwarten, dass es etwas mit dem Packen macht, was anders ist.

Ihre Struktur scheint wie folgt aufgebaut zu sein:

%Vor%     
Greg Hewgill 28.12.2010 07:30
quelle
0

aligned (8) bedeutet nur, dass die Adresse von & amp; e.a um 8 ausgerichtet wird. Und es ist (2280712). sizeof (int) ist vermutlich 4, weshalb dein Char bei 2280716 endet (er hat eine Ausrichtungsanforderung von 1, also gibt es keinen Grund dafür, dass er auf 2280720 verschoben wird). Fügen Sie einfach sizeof (int) zu Ihrer Debug-Ausgabe hinzu, um es zu überprüfen.

Sie müssen Ihre Build-Zieleinstellungen ändern, wenn Sie 64-Bit-Ints verwenden möchten.

    
EboMike 28.12.2010 07:31
quelle

Tags und Links