pack
为结构、联合和类成员指定 pack 对齐。
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
备注
pack 使控件在数据声明级别。 这与编译器选项 /Zp不同,只提供模块级的控件。 pack 反映在第一 struct, union,或者在注释后面的 class 声明显示。 pack 对定义的效果。 调用没有参数的 pack 设置 n 对编译器选项设置的值 /Zp。 如果编译器选项未设置,则默认值为 8。
如果更改结构的对齐方式,它在内存不可能使用尽可能多的空间,但是,您可以为对齐的访问以查看性能甚至获取降低一个硬件生成的异常。 使用 SetErrorMode,您可以修改该异常行为。
show(可选)
显示打包对齐的当前字节值。 该值由警告消息显示。push(可选)
推送到内部编译器的当前 pack 对齐值,并将当前 pack 对齐值设置为 n。 如果 n 未指定,则使用当前 pack 对齐值被推送。pop(可选)
从内部编译器堆栈的顶部移除该记录。 如果 n 未指定与 pop,则 pack 值与堆栈的顶部生成的记录是新的 pack 对齐值。 如果 n 指定,例如, #pragma pack(pop, 16), n 将成为新的 pack 对齐值。 如果弹出与 identifier,例如, #pragma pack(pop, r1),则在堆栈上的所有记录弹出直到有 identifier 找到的记录。 记录弹出,并且 pack 值与上面的发生的记录与堆栈新的 pack 对齐值。 如果在堆栈上的任何记录未找到您的弹出与 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_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