Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Anger packningsjusteringen för struktur-, union- och klassmedlemmar.
Syntax
#pragma pack( show )
#pragma pack( push[,identifier] [,n])
#pragma pack( pop[,{identifier|n} ])
#pragma pack([n])
Parametrar
show
(Valfritt) Visar aktuellt bytevärde för förpackningsjustering. Värdet visas med ett varningsmeddelande.
push
(Valfritt) Push-överför det aktuella packningsjusteringsvärdet på den interna kompilatorstacken och anger det aktuella justeringsvärdet för packning till n. Om n inte anges skickas det aktuella justeringsvärdet för packning.
pop
(Valfritt) Tar bort posten överst i den interna kompilatorstacken. Om n inte anges med popär förpackningsvärdet som är associerat med den resulterande posten överst i stacken det nya justeringsvärdet för packning. Om n anges blir till exempel #pragma pack(pop, 16), n det nya justeringsvärdet för packning. Om du dyker upp med hjälp av en identifier, till exempel #pragma pack(pop, r1), visas alla poster i stacken tills den post som har identifier hittas. Den posten poppas och det förpackningsvärde som är associerat med posten som finns överst i stacken blir det nya justeringsvärdet för packning. Om du använder en identifier som inte finns i någon post i stacken ignoreras pop.
Instruktionen #pragma pack (pop, r1, 2) motsvarar #pragma pack (pop, r1) följt av #pragma pack(2).
identifier
(Valfritt) När det används med pushtilldelar du posten ett namn på den interna kompilatorstacken. När den används med pop, öppnas poster från den interna stacken tills identifier tas bort. Om identifier inte hittas på den interna stacken, visas ingenting.
n
(Valfritt) Anger det värde i byte som ska användas för förpackning. Om kompileringsalternativet /Zp inte har angetts för modulen är standardvärdet för n 8. Giltiga värden är 1, 2, 4, 8 och 16. Justeringen av en medlem ligger på en gräns som antingen är en multipel av n, eller en multipel av medlemmens storlek, beroende på vilket som är mindre.
Anmärkningar
Att paket en klass är att placera sina medlemmar direkt efter varandra i minnet. Det kan innebära att vissa eller alla medlemmar kan justeras på en gräns som är mindre än standardjusteringen för målarkitekturen.
pack ger kontroll på datadeklarationsnivå. Den skiljer sig från kompilatoralternativet /Zp, som endast tillhandahåller kontroll på modulnivå.
pack börjar gälla den första struct, unioneller class deklarationen efter att pragma har setts.
pack har ingen effekt på definitioner. Anropar pack utan argument anger n till värdet som anges i kompilatoralternativet /Zp. Om kompileringsalternativet inte har angetts är standardvärdet 8 för x86, ARM och ARM64. Standardvärdet är 16 för x64-inbyggda och ARM64EC.
Om du ändrar justeringen för en struktur kanske den inte använder så mycket utrymme i minnet. Du kan dock se en förlust av prestanda eller till och med få ett maskinvarugenererat undantag för ojusterad åtkomst. Du kan ändra det här undantagsbeteendet med hjälp av SetErrorMode.
Mer information om hur du ändrar justering finns i följande artiklar:
-
Varning
I Visual Studio 2015 och senare kan du använda standardoperatorerna
alignasochalignof, som till skillnad från__alignofoch__declspec( align )är portabla mellan kompilatorer. C++-standarden adresserar inte packning, så du måste fortfarande användapack(eller motsvarande tillägg på andra kompilatorer) för att ange justeringar som är mindre än målarkitekturens ordstorlek.
Exempel
Följande exempel visar hur du använder packpragma för att ändra justeringen av en struktur.
// 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
Följande exempel visar hur du använder push-, popoch visa syntax.
// 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