pack
Určuje zarovnání balení pro strukturu unie a členů tříd.
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
Poznámky
packumožňuje řízení na úrovni dat prohlášení.Tím se liší od volba kompilátoru /Zp, který poskytuje pouze úroveň modulu řízení.packse projeví na první struct, union, nebo class prohlášení po pragma je vidět.packnemá žádný vliv na definicích.Volání pack se žádné argumenty sady n na hodnotu v volba kompilátoru /Zp.Pokud není nastavena možnost kompilátoru, výchozí hodnota je 8.
Můžete změnit zarovnání struktury, nevyužívá prostor v paměti, ale viz snížení výkonu nebo dokonce získat hardwaru generovány výjimku pro nezarovnané přístup.Toto chování výjimku lze upravit pomocí SetErrorMode.
show(volitelné)
Zobrazí aktuální hodnotu bajtu pro balení zarovnání.Hodnota je zobrazen upozornění.push(volitelné)
Posune zarovnání aktuálního dodacího hodnotu na vnitřním zásobníku překladače a nastaví hodnotu aktuálního dodacího zarovnání na n.Pokud n není zadána, aktuální hodnota zarovnání balení se posune.pop(volitelné)
Odstraní záznam z horní zásobník kompilátoru.Pokud n není zadána s pop, balení hodnotu přidruženou k výsledný záznam v horní části zásobníku je nové balení hodnotu zarovnání.Pokud n například zadána #pragma pack(pop, 16), n se stane novou hodnotu zarovnání na balení.Pokud pop s identifier, například #pragma pack(pop, r1), pak jsou všechny záznamy v zásobníku popped do záznamu, který má identifier je nalezen.Že záznam je popped a balení hodnotu přidruženou k výsledný záznam v horní části zásobníku nové balení hodnotu zarovnání.Pokud pop s identifier nebyl nalezen v záznamech zásobníku, pak bude pop je ignorována.identifier(volitelné)
Při použití s push, přiřadí název záznamu v zásobníku kompilátoru.Při použití s pop, POP záznamy vnitřního zásobníku až do identifier odstraněny; Pokud identifier nebyl nalezen v interním zásobníku, nic se popped.n (volitelné)
Určuje hodnotu, v bajtech pro balení.Pokud volba kompilátoru /Zp není nastavena pro modul výchozí hodnotu pro n je 8.Platné hodnoty jsou 1, 2, 4, 8, a 16.Zarovnání člen bude na hranici, která je násobkem n nebo násobek velikosti člena, je menší.
#pragma pack(pop,identifier, n)není definována.
Další informace o tom, jak změnit zarovnání naleznete v následujících tématech:
Příklady zarovnání struktur(konkrétní x 64)
Příklad
Následující příklad ukazuje použití pack pragma změnit zarovnání 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
Následující příklad ukazuje použití push, pop, a show syntaxe.
// 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