Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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:
-
Figyelmeztetés
A Visual Studio 2015-ben és újabb verzióiban használhatja a szabványos
alignasésalignofoperá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áhozpack(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