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) 是未定义的。

有关如何修改对齐方式的更多信息,请参见下列主题:

示例

下面的示例演示如何使用 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

下面的示例演示如何使用 pushpopshow 语法。

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

请参见

参考

杂注指令和__Pragma关键字