原文链接: 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

 
 
 
 
 
 

#pragma pack的更多相关文章

  1. #pragma pack(push,1)与#pragma pack(1)的区别

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

  2. #pragma pack(n)

    #pragma pack(n) 重要规则: 1,复杂类型中各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个类型的地址相同: 2,每个成员分别对齐,即每个成员按自己的方式对齐,并最小 ...

  3. warning malformed '#pragma pack(push[, id], n)' - ignored

    bmp.c:8: warning: malformed '#pragma pack(push[, id], <n>)' - ignored bmp.c:33: warning: #prag ...

  4. 关于pragma pack的用法(一)

    一个很重要的参数#pragma pack(n) 数据边界对齐方式:以如下结构为例: struct {                    char a;                    WOR ...

  5. C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)

    转载地址 : http://blog.csdn.net/21aspnet/article/details/6729724 一.概念    对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它 ...

  6. C++编译指令#pragma pack的配对使用

    #pragma pack可以用来指定C++数据结构的成员变量的内存对齐数值(可选值为1,2,4,8,16). 本文主要是强调在你的头文件中使用pack指令要配对使用,以避免意外影响项目中其他源文件的结 ...

  7. (转载)关于#pragma pack(push,1)和#pragma pack(1)

    转载http://www.rosoo.net/a/201203/15889.html 一.#pragma pack(push,1)与#pragma pack(1)的区别 这是给编译器用的参数设置,有关 ...

  8. pragma pack(非常有用的字节对齐用法说明)

    强调一点: #pragma pack(4) typedef struct { char buf[3]; word a; }kk; #pragma pack() 对齐的原则是min(sizeof(wor ...

  9. #pragma pack(n) 的作用

    在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.float等)的变量,也可以是一些复合数据类型(如数组.结构.联合等)的数据单元.在结构中,编译器为结构的每个成 ...

  10. #pragma pack(push,1)与#pragma pack(pop)

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

随机推荐

  1. 【Handler】Looper 原理 详解 示例 总结

    核心知识点 1.相关名词 UI线程:就是我们的主线程,系统在创建UI线程的时候会初始化一个Looper对象,同时也会创建一个与其关联的MessageQueue Handler:作用就是发送与处理信息, ...

  2. Java基础(六):继承

    1.继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具 ...

  3. poj_1681_高斯消元

    这道题和之前的把那一道1222很类似.仅仅只是一定要注意一下对于无解的推断. /*########################################################### ...

  4. 【linux】重置fedora root密码

    I forget root password on fedora,debian.fedora 17 fedora 18 fedora 19 fedora 20 fedora 21 fedora .de ...

  5. 帝吧fb出征是什么原因?帝吧fb出征事情始末 帝吧出征FB打“台独” 台湾网民崩溃:巨人之墙爆了

    帝吧出征FB打"台独" 台湾网民崩溃:巨人之墙爆了 发表时间:2016-01-20 21:08:10 字号:A-AA+ 关键字: 帝吧帝吧出征FB帝吧出征FB打台独台独脸书巨人之墙 ...

  6. linux python调试技巧

    Linux下Python基础调试 http://blog.163.com/liuyuhuan0915@126/blog/static/78265448201141662828820/ 当手边没有IDE ...

  7. 微信小程序 - 使用npm(第三方包)

    使用示例: 1. 开启“使用npm模块” 2. 新建 node_modules 文件夹 3. cd到新建 node_modules 所在的目录(非node_modules文件夹内) npm insta ...

  8. SpingBoot:Unregistering JMX-exposed beans on shutdown

    运行之后控制台输出“Unregistering JMX-exposed beans on shutdown”原因为:SpringBoot内置Tomcat没有正常启动,加入spring-boot-sta ...

  9. java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列

    java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列 package org.rui.collection2.maps; /** * 散列与散列码 * 将土拔鼠对象与预报对象 ...

  10. PHP $_POST

    $_POST 变量用于收集来自 method="post" 的表单中的值. $_POST 变量 $_POST 变量是一个数组,内容是由 HTTP POST 方法发送的变量名称和值. ...