Freigeben über


pack

Gibt die Komprimierungsausrichtung für Struktur, Union und Klassenmember an.

#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  )

Hinweise

pack ermöglicht die Steuerung auf der Datendeklarationsebene. Dies unterscheidet sich von der Compileroption /Zp, die nur die Modulebenensteuerung bereitstellt. pack wird bei der ersten struct-, union- oder class-Deklaration wirksam, nachdem das Pragma angezeigt wird. pack hat keine Auswirkungen auf Definitionen. Das Aufrufen von pack ohne Argumente legt n auf den Wert fest, der in der Compileroption /Zp festgelegt ist. Wenn die Compileroption nicht festgelegt ist, ist der Standardwert 8.

Wenn Sie die Ausrichtung einer Struktur ändern, belegt sie vielleicht nicht so viel Platz im Arbeitsspeicher, aber Sie werden eine Abnahme der Leistung feststellen oder sogar eine von der Hardware generierte Ausnahme für einen nicht ausgerichteten Zugriff erhalten. Sie können dieses Ausnahmeverhalten mithilfe von SetErrorMode ändern.

  • show(optional)
    Zeigt den aktuellen Bytewert für die Verpackungsausrichtung an. Der Wert wird von einer Warnmeldung angezeigt.

  • push(optional)
    Überträgt den aktuellen Verpackungsausrichtungswert mittels Push auf den internen Compilerstapel und legt den aktuellen Verpackungsausrichtungswert auf n fest. Wenn n nicht angegeben ist, wird der aktuelle Verpackungsausrichtungswert mittels Push auf den Stapel übertragen.

  • pop(optional)
    Entfernt den Datensatz von der obersten Position des internen Compilerstapels. Wenn n nicht mit pop angegeben ist, ist der Paketwert, der dem resultierenden Datensatz oben auf dem Stapel zugeordnet ist, der neue Verpackungsausrichtungswert. Wenn z. B. n #pragma pack(pop, 16) angegeben ist, wird n der neue Verpackungsausrichtungswert. Wenn Sie ein Element mit identifier per pop auslesen möchten, z. B. mit #pragma pack(pop, r1), werden alle Datensätze bis zu dem Datensatz aus dem Stapel per pop ausgelesen, bei dem der identifier gefunden wird. Dieser Datensatz wird per pop ausgelesen, und der Paketwert, der mit dem resultierenden Datensatz oben auf dem Stapel verknüpft ist, ist der neue Verpackungsausrichtungswert. Wenn Sie einen identifier per pop auslesen möchten, der in keinem Datensatz auf dem Stapel gefunden wird, wird pop ignoriert.

  • identifier(optional)
    Bei Verwendung mit push wird dem Datensatz im internen Compilerstapel ein Name zugewiesen. Bei Verwendung mit pop werden Datensätze vom internen Stapel geholt, bis identifier entfernt wird. Wenn identifier im internen Stapel nicht gefunden wird, wird kein Element vom Stapel geholt.

  • n (optional)
    Gibt den Wert in Bytes an, der für die Komprimierung verwendet werden soll. Wenn die Compileroption /Zp nicht für das Modul festgelegt wird, ist 8 der Standardwert für n. Gültige Werte sind 1, 2, 4, 8 und 16. Die Ausrichtung eines Members erfolgt an einer Begrenzung, die entweder ein Vielfaches von n oder ein Vielfaches der Größe des Members ist, je nachdem, was kleiner ist.

#pragma pack(pop, identifier, n) ist nicht definiert.

Weitere Informationen zur Änderung der Ausrichtung finden Sie unter folgenden Themen:

Beispiel

Das folgende Beispiel zeigt, wie das Pragma pack verwendet wird, um die Ausrichtung einer Struktur zu ändern.

// pragma_directives_pack.cpp
#include <stddef.h>
#include <stdio.h>

struct S {
   int i;   // size 4
   short j;   // size 2
   double k;   // size 8
};

#pragma pack(2)
struct T {
   int i;
   short j;
   double k;
};

int main() {
   printf("%Iu ", offsetof(S, i));
   printf("%Iu ", offsetof(S, j));
   printf("%Iu\n", offsetof(S, k));

   printf("%Iu ", offsetof(T, i));
   printf("%Iu ", offsetof(T, j));
   printf("%Iu\n", offsetof(T, k));
}

0 4 8
0 4 6

Das folgende Beispiel veranschaulicht, wie die push-, die pop- und die show-Syntax verwendet werden.

// pragma_directives_pack_2.cpp
// compile with: /W1 /c
#pragma pack()   // n defaults to 8; equivalent to /Zp8
#pragma pack(show)   // C4810
#pragma pack(4)   // n = 4
#pragma pack(show)   // C4810
#pragma pack(push, r1, 16)   // n = 16, pushed to stack
#pragma pack(show)   // C4810
#pragma pack(pop, r1, 2)   // n = 2 , stack popped
#pragma pack(show)   // C4810

Siehe auch

Referenz

Pragma-Direktiven und das __Pragma-Schlüsselwort