pack 为 struct, union 和 class 等的成员对齐指定字节边界. 与编译选项(属性 -> 配置属性 -> C/C++ ->代码生成 -> 结构成员对齐)的 /Zp 开关不同, 它不针对整个项目, 而仅针对模块, 比如一个编译单元.
1. #pragma pack(show)
2. #pragma pack(n)
3. #pragma pack()
4. #pragma pack(push)
5. #pragma pack(pop)
6. #pragma pack(push, n)
7. #pragma pack(pop, n)
8. #pragma pack(push, identifier)
9. #pragma pack(pop, identifier)
10. #pragma pack(push, identifier, n)
11. #pragma pack(pop, identifier, n)
注意: 如果在栈中没有找到 pop 中的标识符, 则编译器忽略该指令, 而且不会弹出任何值.
// 代码段 1: 弹出编译栈的顺序跟压入的顺序相反
#pragma pack(show)
#pragma pack(push, 16) // 默认值 8 压入编译栈栈顶, 并将当前对齐值设为 16 .
#pragma pack(show)
#pragma pack(push, 4)
#pragma pack(show)
#pragma pack(push, 2)
#pragma pack(show)
#pragma pack(push, 1)
#pragma pack(show)
#pragma pack(pop)
#pragma pack(show)
#pragma pack(pop)
#pragma pack(show)
#pragma pack(pop)
#pragma pack(show)
#pragma pack(pop)
#pragma pack(show)
// 代码段 2: pop 带有参数 n 时, 当前字节对齐值被设为了 n, 而不是从栈顶弹出的之前所压入的值.
#pragma pack(show)
#pragma pack(push, 16) // 默认值 8 压入编译栈栈顶, 并将当前对齐值设为 16 .
#pragma pack(show)
#pragma pack(push, 4)
#pragma pack(show)
#pragma pack(push, 2)
#pragma pack(show)
#pragma pack(push, 1)
#pragma pack(show)
#pragma pack(pop, 8)
#pragma pack(show)
#pragma pack(pop, 1)
#pragma pack(show)
#pragma pack(pop, 2)
#pragma pack(show)
#pragma pack(pop, 16)
#pragma pack(show)
// 代码段3: push 和 pop 可以带有标识符, 此标识符能够弹出指定值. 但是, 位于栈中指定值之上的那些值均会被弹出并丢弃.
#pragma pack(show)
#pragma pack(push, identifier_1, 1)
#pragma pack(show)
#pragma pack(push, identifier_2, 2)
#pragma pack(show)
#pragma pack(push, identifier_3, 4)
#pragma pack(show)
#pragma pack(push, identifier_4, 8)
#pragma pack(show)
#pragma pack(push, identifier_5, 16) // 上上句 8 压入编译栈栈顶, 并将栈中 8 对应的位置用 identifier_5 标识起来, 然后将当前对齐值设为 16 .
#pragma pack(show)
#pragma pack(push, identifier_6)
#pragma pack(show)
#pragma pack(pop, identifier_6)
#pragma pack(show)
#pragma pack(pop, identifier_5, 2)
#pragma pack(show)
#pragma pack(pop, identifier_1)
#pragma pack(show)
#pragma pack 用法详解
最新推荐文章于 2024-11-15 10:02:13 发布