pack
指定封裝的結構、 等位,以及類別成員的對齊方式。
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
備註
pack可讓控制項在資料宣告層級。 這點不同於編譯器選項 /Zp,它只提供模組層級的控制項。 pack開始生效的第一次struct, union,或class宣告後會看到 pragma。 pack不沒有定義任何作用。 呼叫pack沒有引數集與n的編譯器選項在設定的值為**/Zp**。 如果未設定編譯器選項,則預設值為 8。
如果您變更結構的對齊方式,它可能使用的空間中的記憶體,但是您可能會發現效能降低,或取得硬體所產生的例外狀況,以未對齊的存取。 您可以修改此例外狀況行為使用 SetErrorMode。
show(選擇性)
顯示目前的壓縮對齊方式的位元組值。 這個值會顯示警告訊息。push(選擇性)
內部編譯器堆疊,並將目前的封裝對齊值的集合上的推入目前的封裝對齊值n。 如果n未指定,則目前的壓縮對齊值推入。pop(選擇性)
編譯器內部堆疊的頂端會移除資料錄。 如果n未指定pop,則產生的記錄堆疊的頂端與相關的封裝值是新的壓縮對齊值。 如果n指定,例如, #pragma pack(pop, 16), n會變成新的壓縮對齊值。 如果您使用快顯identifier,例如, #pragma pack(pop, r1),那麼所有的記錄,在堆疊上取出才有的資料錄identifier找不到。 在取出資料錄,並與產生的記錄,在上面的相關的封裝值是堆疊新的封裝對齊值。 如果您使用快顯identifier ,中找不到任何記錄,在堆疊上,然後在pop會被忽略。identifier(選擇性)
搭配使用時push,將名稱指派給內部編譯器堆疊上的資料錄。 搭配使用時pop,直到內部堆疊的記錄會顯示identifier會被移除。 如果identifier中找不到內部堆疊中,執行任何動作被取出。n (選擇項)
指定一個值,以位元組為單位,以便進行封裝。 如果編譯器選項 /Zp 尚未設定模組,也就是預設值為n為 8。 有效值為 1、 2、 4、 8 和 16。 成員的對齊方式會在可能的界限上對齊之n或成員大小的倍數兩者中較小。
#pragma pack(pop,identifier, n)未定義。
如需有關如何修改對齊方式的詳細資訊,請參閱下列主題:
結構對齊範例 (x64 專用)
範例
下列範例示範如何使用pack pragma,以變更結構的對齊方式。
// 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
下列範例示範如何使用push, pop,以及show語法。
// 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