#pragma pack 用法详解

pack为struct、union和class等的成员对齐指定字节边界,与编译选项(属性 -> 配置属性 -> C/C++ ->代码生成 -> 结构成员对齐)的/Zp开关不同,它不针对整个项目,而仅针对模块,比如一个编译单元。

1. #pragma pack(show)

以警告信息的形式显示当前字节对齐的值。

2. #pragma pack(n)

将当前字节对齐值设为 n。

3. #pragma pack()

将当前字节对齐值设为默认值(通常是8)。

4. #pragma pack(push)

将当前字节对齐值压入编译栈栈顶。

5. #pragma pack(pop)

将编译栈栈顶的字节对齐值弹出并设为当前值。

6. #pragma pack(push, n)

先将当前字节对齐值压入编译栈栈顶,然后再将 n 设为当前值。

7. #pragma pack(pop, n)

将编译栈栈顶的字节对齐值弹出,然后丢弃,再将 n 设为当前值。

8. #pragma pack(push, identifier)

将当前字节对齐值压入编译栈栈顶,然后将栈中保存该值的位置标识为 identifier。

9. #pragma pack(pop, identifier)

将编译栈栈中标识为 identifier 位置的值弹出,并将其设为当前值。注意,如果栈中所标识的位置之上还有值,那会先被弹出并丢弃。

10. #pragma pack(push, identifier, n)

将当前字节对齐值压入编译栈栈顶,然后将栈中保存该值的位置标识为 identifier,再将 n 设为当前值。

11. #pragma pack(pop, identifier, n)

将编译栈栈中标识为 identifier 位置的值弹出,然后丢弃,再将 n 设为当前值。注意,如果栈中所标识的位置之上还有值,那会先被弹出并丢弃。

注意:如果在栈中没有找到 pop 中的标识符,则编译器忽略该指令,而且不会弹出任何值。

// 代码段 1: 弹出编译栈的顺序跟压入的顺序相反

#pragma pack(show) // 8 (默认值)

#pragma pack(push, 16) // 默认值 8 压入编译栈栈顶, 并将当前对齐值设为 16 .

#pragma pack(show) // 上句设定的 16

#pragma pack(push, 4) // 上上句 16 压入编译栈栈顶, 并将当前对齐值设为 4 .

#pragma pack(show) // 上句设定的 4

#pragma pack(push, 2) // 上上句 4 压入编译栈栈顶, 并将当前对齐值设为 2 .

#pragma pack(show) // 上句设定的 2

#pragma pack(push, 1) // 上上句 2 压入编译栈栈顶, 并将当前对齐值设为 1 .

#pragma pack(show) // 上句设定的 1

#pragma pack(pop) // 弹出编译栈栈顶的 2 , 并将其设为当前对齐值.

#pragma pack(show) // 2

#pragma pack(pop) // 弹出编译栈栈顶的 4 , 并将其设为当前对齐值.

#pragma pack(show) // 4

#pragma pack(pop) // 弹出编译栈栈顶的 16 , 并将其设为当前对齐值.

#pragma pack(show) // 16

#pragma pack(pop) // 弹出编译栈栈顶的 8 , 并将其设为当前对齐值.

#pragma pack(show) // 8

// 代码段 2: pop 带有参数 n 时, 当前字节对齐值被设为了 n, 而不是从栈顶弹出的之前所压入的值.

#pragma pack(show) // 8 (默认值)

#pragma pack(push, 16) // 默认值 8 压入编译栈栈顶, 并将当前对齐值设为 16 .

#pragma pack(show) // 16

#pragma pack(push, 4) // 上上句 16 压入编译栈栈顶, 并将当前对齐值设为 4 .

#pragma pack(show) // 4

#pragma pack(push, 2) // 上上句 4 压入编译栈栈顶, 并将当前对齐值设为 2 .

#pragma pack(show) // 2

#pragma pack(push, 1) // 上上句 2 压入编译栈栈顶, 并将当前对齐值设为 1 .

#pragma pack(show) // 1

#pragma pack(pop, 8) // 弹出编译栈栈顶的 2 , 然后丢弃, 再将当前对齐值设为 8 .

#pragma pack(show) // 8

#pragma pack(pop, 1) // 弹出编译栈栈顶的 4 , 然后丢弃, 再将当前对齐值设为 1 .

#pragma pack(show) // 1

#pragma pack(pop, 2) // 弹出编译栈栈顶的 16 , 然后丢弃, 再将当前对齐值设为 2 .

#pragma pack(show) // 2

#pragma pack(pop, 16) // 弹出编译栈栈顶的 8 , 然后丢弃, 再将当前对齐值设为 16 .

#pragma pack(show) // 16

// 代码段3: push 和 pop 可以带有标识符,此标识符能够弹出指定值。但是,位于栈中指定值之上的那些值均会被弹出并丢弃。

#pragma pack(show) // 8 (默认值)

#pragma pack(push, identifier_1, 1) // 默认值 8 压入编译栈栈顶,并将栈中 8 对应的位置用 identifier_1 标识起来,然后将当前对齐值设为 1 .

#pragma pack(show) // 1

#pragma pack(push, identifier_2, 2) // 上上句 1 压入编译栈栈顶,并将栈中 1 对应的位置用 identifier_2 标识起来, 然后将当前对齐值设为 2 .

#pragma pack(show) // 2

#pragma pack(push, identifier_3, 4) // 上上句 2 压入编译栈栈顶,并将栈中 2 对应的位置用 identifier_3 标识起来, 然后将当前对齐值设为 4 .

#pragma pack(show) // 4

#pragma pack(push, identifier_4, 8) // 上上句 4 压入编译栈栈顶,并将栈中 4 对应的位置用 identifier_4 标识起来, 然后将当前对齐值设为 8 .

#pragma pack(show) // 8

#pragma pack(push, identifier_5, 16) // 上上句 8 压入编译栈栈顶,并将栈中 8 对应的位置用 identifier_5 标识起来, 然后将当前对齐值设为 16 .

#pragma pack(show)

————————————————
版权声明:本文为CSDN博主「机器视觉001」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liubing8609/article/details/81697414

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值