pakiet
Określa sposób wyrównania pakowania struktury, Unii i składowych klasy.
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
Uwagi
pack zapewnia kontrolę na poziomie deklaracji danych.To różni się od opcji kompilatora /Zp, który zapewnia tylko kontrolę poziomu w module.pack obowiązuje w pierwszym struct, union, lub class deklaracji po dyrektywę pragma jest widoczne.pack nie ma wpływu na definicje.Wywołanie elementu pack z ma zestawów argumentów n jest wartość określona w opcji kompilatora /Zp.Jeśli nie ustawiono opcję kompilatora, wartością domyślną jest 8.
Jeśli zmienisz Wyrównanie struktury, nie można używać jako ilości miejsca w pamięci, ale może zobaczyć spadek wydajności lub nawet pobrania wyjątków generowanych przez sprzętu odwołań do niewyrównanych dostępu.To zachowanie wyjątku można zmodyfikować za pomocą SetErrorMode.
show(opcjonalnie)
Wyświetla bieżącą wartość bajtów do pakowania wyrównania.Wartość jest wyświetlana przez komunikat ostrzegawczy.push(opcjonalnie)
Umieszcza bieżący wyrównanie pakowania wartość dla wewnętrznego stosu kompilatora i ustawia wartość bieżącego wyrównanie pakowania do n.Jeśli n nie jest określony, bieżącego pakowania Wyrównanie wartości zostanie przypisany.pop(opcjonalnie)
Usuwa rekord od górnej krawędzi wewnętrznego stosu kompilatora.Jeśli n nie określono z pop, wartość pakowania powiązane z rekordem wynikowe górze stosu jest nowy, a następnie pakowania Wyrównanie wartości.Jeśli n jest określony, na przykład #pragma pack(pop, 16), n staje się nowy pakowania Wyrównanie wartości.Jeśli pop z identifier, na przykład #pragma pack(pop, r1), a następnie wszystkie rekordy na stosie są tam pojawi do rekordu, który ma identifier zostanie znaleziony.Czy rekord jest tam pojawi i pakowania wartość skojarzoną z wynikowego rekordu w nad jest stosu nowe pakowania Wyrównanie wartości.Jeśli pop z identifier nie znaleziono żadnych rekordów na stosie, a następnie pop jest ignorowana.identifier(opcjonalnie)
W przypadku użycia z push, przypisuje nazwę w rekordzie na stosie kompilatora wewnętrzny.W przypadku użycia z pop, POP rekordów wewnętrznego stosu dopóki identifier zostanie usunięty, jeśli identifier nie zostanie znaleziony w stosie wewnętrzny, nic nie jest tam pojawi.n (opcjonalnie)
Określa wartość, w bajtach, do użycia podczas pakowania.Jeśli opcja kompilatora /Zp nie jest ustawiony dla modułu, wartość domyślną dla n jest 8.Poprawne wartości to 1, 2, 4, 8 do 16.Wyrównanie elementu członkowskiego będzie w granicach, który może być wielokrotnością liczby n lub wielokrotnością rozmiaru elementu członkowskiego, który z nich jest mniejsza.
#pragma pack(pop,identifier, n) nie jest zdefiniowana.
Aby uzyskać więcej informacji na temat modyfikacji wyrównanie zobacz następujące tematy:
Przykłady struktury wyrównanie (określonych x 64)
Przykład
Poniższy przykład przedstawia sposób użycia pack dyrektywę 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("%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
Poniższy przykład przedstawia 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