Megosztás:


pack pragma

Meghatározza a szerkezet, az egyesítés és az osztálytagok csomagolási igazítását.

Szintaxis

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

Paraméterek

show
(Nem kötelező) Megjeleníti a csomagolás igazításának aktuális bájtértékét. Az érték egy figyelmeztető üzenetben jelenik meg.

push
(Nem kötelező) Leküldi a belső fordítóverem aktuális csomagolásigazítási értékét, és az aktuális csomagolásigazítási értéket nértékre állítja. Ha n nincs megadva, a rendszer leküldi az aktuális csomagolás-igazítási értéket.

pop
(Nem kötelező) Eltávolítja a rekordot a belső fordítóverem tetejéről. Ha n nincs megadva a pop, akkor az eredményül kapott rekordhoz tartozó csomagolási érték az új csomagolási igazítási érték. Ha n van megadva, például #pragma pack(pop, 16), n lesz az új csomagolásigazítási érték. Ha egy identifier(például #pragma pack(pop, r1)) használ, akkor a verem összes rekordja mindaddig megjelenik, amíg meg nem találja a identifier rekordot. Ez a rekord megjelenik, és a verem tetején található rekordhoz társított csomagolási érték lesz az új csomagolási igazítási érték. Ha olyan identifier használ, amely nem található a verem egyik rekordjában sem, akkor a pop figyelmen kívül hagyja.

A #pragma pack (pop, r1, 2) utasítás egyenértékű a #pragma pack (pop, r1) és a #pragma pack(2).

identifier
(Nem kötelező) Ha pushhasznál, a belső fordítóverem rekordjának nevét rendeli hozzá. Ha pophasznál, a rekordok a belső veremből jelennek meg, amíg el nem távolítja identifier. Ha identifier nem található a belső veremen, semmi sem bukkan fel.

n
(Nem kötelező) A csomagoláshoz használandó értéket adja meg bájtban. Ha a /Zp fordítóbeállítás nincs beállítva a modulhoz, a n alapértelmezett értéke 8. Az érvényes értékek: 1, 2, 4, 8 és 16. Egy tag igazítása egy olyan határvonalon van, amely vagy a ntöbbszöröse, vagy a tag méretének többszöröse, attól függően, hogy melyik kisebb.

Megjegyzések

Az osztály az, hogy tagjait közvetlenül egymás után helyezi a memóriába. Ez azt jelentheti, hogy néhány vagy az összes tag a célarchitektúra alapértelmezett igazításánál kisebb határvonalon igazítható. pack az adatdeklaráció szintjén biztosítja az irányítást. Ez eltér a /Zpfordítóbeállítástól, amely csak modulszintű vezérlést biztosít. csomag a pragma megtekintése után az első struct, unionvagy class deklarációban lép érvénybe. pack nincs hatása a definíciókra. A pack meghívása argumentumkészletek nélkül n a fordító beállításban megadott értékre /Zp. Ha a fordítóbeállítás nincs beállítva, az alapértelmezett érték 8 x86, ARM és ARM64 esetén. Az alapértelmezett érték x64 natív és ARM64EC esetén 16.

Ha módosítja egy struktúra igazítását, előfordulhat, hogy nem használ annyi helyet a memóriában. Előfordulhat azonban, hogy teljesítménycsökkenést tapasztal, vagy akár hardver által generált kivételt is kap a nem engedélyezett hozzáférés miatt. A kivétel viselkedését a SetErrorModehasználatával módosíthatja.

Az igazítás módosításáról az alábbi cikkekben talál további információt:

  • alignof

  • align

  • __unaligned

  • x64-struktúraigazítási példák

    Figyelmeztetés

    A Visual Studio 2015-ben és újabb verzióiban használhatja a szabványos alignas és alignof operátorokat, amelyek __alignof és __declspec( align ) eltérően a fordítók között hordozhatóak. A C++ szabvány nem foglalkozik a csomagolással, ezért a célarchitektúra szóméreténél kisebb igazítások megadásához pack (vagy más fordítók megfelelő bővítménye) kell használnia.

Példák

Az alábbi minta bemutatja, hogyan módosíthatja a struktúra igazítását a packpragma.

// 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("%zu ", offsetof(S, i));
   printf("%zu ", offsetof(S, j));
   printf("%zu\n", offsetof(S, k));

   printf("%zu ", offsetof(T, i));
   printf("%zu ", offsetof(T, j));
   printf("%zu\n", offsetof(T, k));
}
0 4 8
0 4 6

Az alábbi minta bemutatja, hogyan használható a leküldéses, popés szintaxis.

// 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

// pop to the identifier and then set
// the value of the current packing alignment:
#pragma pack(pop, r1, 2)   // n = 2, stack popped
#pragma pack(show)   // C4810

Lásd még:

Pragma irányelvei, valamint a __pragma és _Pragma kulcsszavak