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łady struktury wyrównanie(określonych x 64)
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