Sdílet prostřednictvím


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ří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

Viz také

Referenční dokumentace

Pragma směrnic a __Pragma klíčové slovo