Share via


pack

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

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

Hinweise

pack gibt Steuerelement auf der DATADeklaration Ebene.Dies unterscheidet sich von der Compileroption /Zp, die nur Steuerelement auf Modulebene bereitstellt.pack tritt bei der ersten struct, unionwirksam, oder class Deklaration nach dem Pragma wird angezeigt.pack hat keine Auswirkungen auf Definitionen.Das Aufrufen von pack ohne Argumente legt n auf den Wert festgelegt, der in der Compileroption /Zpfestgelegt ist.Wenn die Compileroption nicht festgelegt ist, lautet der Standardwert 8.

Wenn Sie die Ausrichtung einer Struktur ändern, verwendet sie nicht so viel Platz im Arbeitsspeicher, aber Sie eine Abnahme der Leistung finden oder sogar rufen möglicherweise eine Ausnahme für erzeugte von der Hardware ab. Der Zugriff nicht ausgerichtetSie können dieses Verhalten ändern, indem Sie Ausnahme SetErrorModeverwenden.

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

  • push(optional)
    Legt den aktuellen Wert für Verpackungs auf dem intern Compilerstapel Verpackungs und den aktuellen Wert der zu nfür diese fest.Wenn n nicht angegeben ist, wird der aktuelle Wert für Verpackungs gedrückt.

  • pop(optional)
    Entfernt den Datensatz von der obersten Position des Compilerstapel intern.Wenn n nicht mit popangegeben ist, ist der Wert für Verpackungs dem resultierenden Datensatz am oberen Rand des Stapels zugeordnet ist, der neue Wert für Verpackungs.Wenn z. B. n#pragma pack(pop, 16)angegeben ist, wird der neue Wert für Verpackungs n .Wenn Sie mit identifier, z. B. #pragma pack(pop, r1)bringen, werden alle Datensätze bis zu dem Datensatz auf dem Stapel geholt, der identifier gefunden wird.Dieser Datensatz eingebunden ist und der Wert für Verpackungs mit dem resultierenden Datensatz an erster Stelle von zugeordnet, lautet der Wert für Verpackungs neue der Stapel.Wenn Sie mit identifier bringen, das in keinem Datensatz auf dem Stapel gefunden wird, wird pop ignoriert.

  • identifier(optional)
    Wenn Sie mit pushverwendet werden, ordnet einen Namen am Datensatz auf dem Compilerstapel intern zu.Wenn sie mit popverwendet werden, zeichnet Knalle vom internen Stapel, bis auf identifier entfernt wurde. identifier wenn nicht auf dem internen Stapel gefunden wird, wird nichts vom Stapel geholt.

  • n (optional)
    Gibt den Wert in Bytes an, die für die Ausrichtung vorgesehen.Wenn die Compileroption /Zp nicht für das Modul festgelegt wird, ist der Standardwert für n 8.Gültige Werte sind 1, 2, 4, 8 und 16.Die Ausrichtung eines Members ist für eine Grenze, die ein Vielfaches von n oder ein Vielfaches der Größe des Members ist, die kleiner ist.

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

Weitere Informationen dazu, wie Ausrichtung, finden Sie unter folgenden Themen:

Beispiel

Im folgenden Beispiel wird gezeigt, wie das pack Pragma verwendet, 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("%d ", offsetof(S, i));
   printf("%d ", offsetof(S, j));
   printf("%d\n", offsetof(S, k));

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

0 4 8
0 4 6

Im folgenden Beispiel wird gezeigt, wie push, popund show Syntax verwendet.

// 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