Sdílet prostřednictvím


pack

Určuje zarovnání balení pro strukturu, unie a členy třídy.

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

Poznámky

pack umožňuje řízení na úrovni dat prohlášení.Tím se liší od možnosti kompilátoru /Zp, který pouze poskytuje ovládací prvek úroveň modulu.pack na první se projeví struct, union, nebo class prohlášení poté, co se zobrazí záhlaví pragma.pack nemá žádný vliv na definice.Volání pack se žádné argumenty sady n je hodnota nastavená v možnosti kompilátoru /Zp.Pokud není nastavena možnost kompilátoru, výchozí hodnota je 8.

Pokud změníte zarovnání struktury, jej nelze použít jako mnoho prostor v paměti, ale může naleznete v části k poklesu výkonu nebo dokonce získat generovaný hardwaru výjimky nezarovnané přístup.Toto chování výjimky lze upravit pomocí SetErrorMode.

  • show(volitelné)
    Zobrazí aktuální hodnotu bajtu pro zabalení zarovnání.Hodnota je zobrazen na zprávu upozornění.

  • push(volitelné)
    Posune aktuální zarovnání balení hodnotu na vnitřním zásobníku kompilátoru a nastaví hodnotu aktuální zarovnání balení do n.Pokud n není zadán, je aktuální hodnota zarovnání balení se posune.

  • pop(volitelné)
    Odstraní záznam z horní části zásobníku vnitřní kompilátoru.Pokud n není zadán s pop, pak je nová hodnota balení přidružené k záznamu výsledný v horní části zásobníku balení zarovnání hodnotu.Pokud n není zadán, například #pragma pack(pop, 16), n se změní na nová balení zarovnání hodnotu.Pokud jste pop s identifier, například #pragma pack(pop, r1), pak jsou odebrány všechny záznamy v zásobníku až záznam, který má identifier nalezen.Záznam je odebrány a je hodnota balení přidružené k záznamu výsledný v horní části zásobníku nové balení zarovnání hodnotu.Pokud jste pop s identifier není nalezen v žádném záznamu v 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 vnitřní kompilátoru.Při použití s pop, POP záznamy ze zásobníku vnitřní, dokud identifier je odebrána, pokud identifier nebyl nalezen v zásobníku vnitřní, nic se odebrány.

  • n (volitelné)
    Určuje hodnotu, v bajtech, který se má použít pro balení.Pokud možnost kompilátoru /Zp není nastaven pro modul, výchozí hodnotu pro n je 8.Platné hodnoty jsou 1, 2, 4, 8 a 16.Zarovnání člena bude na hranici, která je buď násobek n nebo násobek velikosti člena, podle toho, která je menší.

#pragma pack(pop,identifier, n) není definován.

Další informace o tom, jak upravit zarovnání, naleznete v následujících tématech:

Příklad

Následující příklad ukazuje, jak používat pack pragma můžete 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("%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

Následující příklad ukazuje, jak používat 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

Direktivy Pragma a klíčové slovo __Pragma