Was sind die Unterschiede zwischen #pragma pack (push, n) / # pragma pack (pop) und __attribute __ ((__ packed__, aligned (n))) auf GCC?

9

Was sind die Unterschiede zwischen den beiden folgenden Vorgehensweisen bei GCC (das heißt, beide mit GCC kompilieren)?

%Vor%

und:

%Vor%

Sie scheinen sich :

%Vor%

Warum gibt es einen Fehler in einem, aber nicht den anderen? Sind die Speicherlayouts mindestens gleich?

    
Claudiu 30.10.2015, 13:33
quelle

1 Antwort

3

Sie sagen nicht, welche Version von GCC Sie verwenden, aber Sie finden das entsprechende Handbuch online . Sie sind in dieser Hinsicht jedoch alle ziemlich kompatibel, da das Verhalten von Attributen und Pragmas, wenn es einmal definiert wurde, normalerweise aus Gründen der Kompatibilität zwischen verschiedenen Versionen beibehalten wird. Ich ziehe bestimmte Zitate aus dem Handbuch für GCC 4.9.3, derzeit die neueste verfügbare Version aus der GCC 4-Serie. Insbesondere die Abschnitte zu Attribute und ein Struktur-Packing-Pragmas sind relevant .

Das GCC-Handbuch sagt von #pragma pack und Freunden:

  

#pragma-Direktiven, die die maximale -Ausrichtung von Elementen von Strukturen (außer Null-Bit-Feldern), Vereinigungen und Klassen, die später definiert werden, ändern.

(Hervorhebung hinzugefügt). Es sagt von __attribute__((packed)) :

  

Dieses an die Struktur- oder Unionstypdefinition angehängte Attribut gibt an, dass jedes Element (mit Ausnahme der Bitfelder mit der Breite Null) der Struktur oder der Union platziert wird, um den erforderlichen Arbeitsspeicher zu minimieren.

Es heißt von __attribute__ ((aligned(n))) :

  

Dieses Attribut gibt eine minimale -Ausrichtung für Variablen des angegebenen Typs an, gemessen in Bytes.

(Hervorhebung hinzugefügt).

Also, #pragma pack(n) , mit oder ohne push , bedeutet im Allgemeinen nicht das Gleiche wie das Anhängen von __attribute__((packed, aligned(n)) an den Strukturtyp. Ersteres legt fest, dass Mitglieder betroffener Strukturen auf n -Byte oder feinere Grenzen ausgerichtet werden. Letzteres legt fest, dass Mitglieder der betroffenen Struktur mit der minimal zulässigen Auffüllung gepackt werden und dass die gewählte Ausrichtungsanforderung für Instanzen der Gesamtstruktur nicht kleiner als n sein darf. Diese sind nicht nur nicht gleich, sie sind sich auch nicht sehr ähnlich.

Sie sollten feststellen, dass #pragma pack(1) , das sich auf eine Strukturdefinition auswirkt, den gleichen Effekt auf das Layout von Instanzen hat wie das Anhängen von __attribute__((packed)) an die Definition dieser Struktur. Selbst wenn sie das gleiche Ziel erreichen, sind sie nicht das Gleiche. Das Verhalten und die Auswirkungen von beiden liegen außerhalb der C ++ - Spezifikation, und GCC hat das Recht, sie in anderer Hinsicht anders zu behandeln.

Wenn Sie Attribute verwenden möchten, um die Ausrichtung von Strukturelementen zu beeinflussen, müssen Sie jedoch mindestens einige Attribute auf Mitgliedsbasis anwenden. Zum Beispiel ...

%Vor%

... könnte den gleichen Effekt haben wie ...

%Vor%

..., abhängig von n .

    
John Bollinger 30.10.2015, 14:25
quelle

Tags und Links