• #pragma pack


    原文链接: http://www.cnblogs.com/s7vens/archive/2012/03/06/2382236.html

    pack 为 struct, union 和 class 等的成员对齐指定字节边界. 与编译选项的 /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)                          // 16
    #pragma pack(push, identifier_6)       // 上上句 16 压入编译栈栈顶, 并将栈中 16 对应的位置用 identifier_6 标识起来.
    #pragma pack(show)                          // 16
    #pragma pack(pop, identifier_6)         // 将标识符 identifier_6 对应的栈中值 16 弹出, 并将其设为当前对齐值.
    #pragma pack(show)                          // 16
    #pragma pack(pop, identifier_5, 2)     // 将标识符 identifier_6 对应的栈中值 8 弹出, 然后丢弃, 再将当前对齐值设为 2 .
    #pragma pack(show)                          // 2
    #pragma pack(pop, identifier_1)         // 按入栈顺序进行弹出, 直到遇到标识符 identifier_1 标识的8 .
    #pragma pack(show)                          // 8

     
     
     
     
     
     
  • 相关阅读:
    [转]GO语言下载、安装、配置
    Go语言标准库
    GPIO与外部中断
    i.MX RT1050 Boot(RT1021通用)
    i.MX RT系列跨界处理器电源时序设计要点
    i.MX RT1050 Memory Management
    Java如何实现定时任务?
    Java如何使用实时流式计算处理?
    音色的秘密:泛音
    用程序计算出钢琴88个键的音高
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4607372.html
Copyright © 2020-2023  润新知