Udostępnij za pośrednictwem


pack

Określa wyrównanie pakowania struktury, Unii i elementy klas.

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

Uwagi

packdaje kontrolę na poziomie deklaracji danych.To różni się od opcji kompilatora /Zp, który zapewnia tylko moduł poziom kontroli.packstaje się skuteczne po pierwszym struct, union, lub class zgłoszenia po pragma jest widoczne.packnie ma wpływu na definicje.Wywołanie pack z zestawami nie argumenty n na wartość w opcji kompilatora /Zp.Jeśli nie ustawiono opcję kompilatora, wartością domyślną jest 8.

Jeśli możesz zmienić wyrównanie struktury, nie może wykorzystywać dużo miejsca w pamięci, ale może zobaczyć spadek wydajności lub nawet get generowane sprzętu wyjątek, aby niewyrównane dostępu.To zachowanie wyjątku można modyfikować za pomocą SetErrorMode.

  • show(opcjonalnie)
    Wyświetla bieżącą wartość bajtu do pakowania wyrównanie.Wartość jest wyświetlana przez komunikat ostrzegawczy.

  • push(opcjonalnie)
    Wypychanie wyrównanie dostawy bieżącej wartości wewnętrznego stosu kompilatora i ustawia wartość bieżącego wyrównania pakowania, do n.Jeśli n nie jest określony, bieżącego pakowania wartość wyrównania jest przesunięta.

  • pop(opcjonalnie)
    Usuwa rekord z wierzchu stosu wewnętrznego kompilatora.Jeśli n nie jest określony z pop, wartość dostawy skojarzonego z rekordem wynikowy na górze stosu jest nowy, a następnie pakowania wartość wyrównania.Jeśli n jest określony, na przykład, #pragma pack(pop, 16), n staje się nowym pakowania wartość wyrównania.Jeśli pop z identifier, na przykład, #pragma pack(pop, r1), a następnie wszystkie rekordy na stosie są tam pojawi aż do rekordu, który ma identifier zostanie znaleziony.Że pojawiały się błędy rekordu i wartość pakowania skojarzonego z rekordem wynikowy na górze stosu nowych opakowań wartość wyrównania.Jeśli pop z identifier nie znaleziono dowolnego rekordu na stosie, a następnie pop jest ignorowana.

  • identifier(opcjonalnie)
    Gdy używana z push, przypisuje nazwę rekordu na stosie wewnętrznego kompilatora.Gdy używana z pop, punkty obecności rekordów ze stosu wewnętrznego aż do identifier usunięte; Jeśli identifier nie zostanie znaleziony na stosu wewnętrznego, nic nie jest tam pojawi.

  • n(opcjonalnie)
    Określa wartość, w bajtach, stosowaną do pakowania.Jeśli opcja kompilatora /Zp nie jest ustawiony dla modułu, wartość domyślna dla n jest 8.Prawidłowymi wartościami są 1, 2, 4, 8 i 16.Wyrównanie Członek będzie na granicy, który jest albo wielu z n lub wielokrotność rozmiaru elementu członkowskiego, mniejsza.

#pragma pack(pop,identifier, n)jest niezdefiniowane.

Aby uzyskać więcej informacji na temat modyfikowania wyrównania, zobacz następujące tematy:

Przykład

Poniższy przykład ilustruje sposób użycia pack pragma, aby zmienić wyrównanie struktury.

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

Poniższy przykład ilustruje sposób użycia push, pop, i show składni.

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

Zobacz też

Informacje

Dyrektywy pragma i __Pragma słowa kluczowego