#pragma pack
Weist den Compiler an, Strukturelemente mit einer bestimmten Ausrichtung zu packen. Die meisten Compiler fügen beim Deklarieren einer Struktur einen Abstand zwischen den Elementen ein, um sicherzustellen, dass sie an den entsprechenden Adressen im Speicher ausgerichtet sind (normalerweise ein Vielfaches der Größe des Typs). Dies vermeidet die Leistungseinbußen (oder Fehler) bei einigen Architekturen, die mit dem Zugriff auf Variablen verbunden sind, die nicht richtig ausgerichtet sind. Beispiel: Geben Sie 4-Byte-Ganzzahlen und die folgende Struktur an:
struct Test
{
char AA;
int BB;
char CC;
};
Der Compiler kann die Struktur wie folgt im Speicher anordnen:
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
und sizeof(Test)
wäre 4 × 3 = 12, obwohl es nur 6 Datenbytes enthält. Der häufigste Anwendungsfall für #pragma
(meines Wissens) ist die Arbeit mit Hardwaregeräten, bei denen Sie sicherstellen müssen, dass der Compiler keine Auffüllungen in die Daten einfügt und jedes Mitglied dem vorherigen folgt. Mit #pragma pack(1)
würde die obige Struktur wie folgt aufgebaut sein:
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
Und sizeof(Test)
wäre 1 × 6 = 6.
Mit #pragma pack(2)
würde die obige Struktur wie folgt aufgebaut sein:
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
Und sizeof(Test)
wäre 2 × 4 = 8.
Die Reihenfolge der Variablen in struct ist ebenfalls wichtig. Mit Variablen, die wie folgt geordnet sind:
struct Test
{
char AA;
char CC;
int BB;
};
und mit #pragma pack(2)
würde die Struktur so angelegt sein:
| 1 | 2 |
| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
und sizeOf(Test)
wäre 3 × 2 = 6.
#pragma
Anweisungen sind sie implementierungsdefiniert.