#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
#pragma pack的更多相关文章
- #pragma pack(push,1)与#pragma pack(1)的区别
这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n) 作用:C编译器将按照n个字节对 ...
- #pragma pack(n)
#pragma pack(n) 重要规则: 1,复杂类型中各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个类型的地址相同: 2,每个成员分别对齐,即每个成员按自己的方式对齐,并最小 ...
- warning malformed '#pragma pack(push[, id], n)' - ignored
bmp.c:8: warning: malformed '#pragma pack(push[, id], <n>)' - ignored bmp.c:33: warning: #prag ...
- 关于pragma pack的用法(一)
一个很重要的参数#pragma pack(n) 数据边界对齐方式:以如下结构为例: struct { char a; WOR ...
- C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)
转载地址 : http://blog.csdn.net/21aspnet/article/details/6729724 一.概念 对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它 ...
- C++编译指令#pragma pack的配对使用
#pragma pack可以用来指定C++数据结构的成员变量的内存对齐数值(可选值为1,2,4,8,16). 本文主要是强调在你的头文件中使用pack指令要配对使用,以避免意外影响项目中其他源文件的结 ...
- (转载)关于#pragma pack(push,1)和#pragma pack(1)
转载http://www.rosoo.net/a/201203/15889.html 一.#pragma pack(push,1)与#pragma pack(1)的区别 这是给编译器用的参数设置,有关 ...
- pragma pack(非常有用的字节对齐用法说明)
强调一点: #pragma pack(4) typedef struct { char buf[3]; word a; }kk; #pragma pack() 对齐的原则是min(sizeof(wor ...
- #pragma pack(n) 的作用
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.float等)的变量,也可以是一些复合数据类型(如数组.结构.联合等)的数据单元.在结构中,编译器为结构的每个成 ...
- #pragma pack(push,1)与#pragma pack(pop)
这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n) 作用:C编译器将按照n个字节对 ...
随机推荐
- 十个WEB开发人员不可不知的HTML5工具
Initializr 这是一个HTML5模板创建工具,帮助你得到持续的最新的HTML5样板文件. XRAY XRAY目前支持Safari, Firefox和IE浏览器,XRAY使用了CSS3的多个酷炫 ...
- STL sort 函数实现详解 ZZ
前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不对劲,知道自己回答错了.这几天特意看了一下,在 ...
- 【HowTo ML】分类问题->神经网络入门
非线性分类器(Non-linear hypotheses) 为什么使用非线性分类器 我们举几个栗子: 假如我们有一个数据空间如左上角坐标系所看到的,那么我们要的模型须要如右边公式所看到的的预測函数. ...
- Windows10下安装pytorch并导入pycharm
1.安装Anaconda 下载:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 安装Anaconda3,最新版本的就可以了,我安装的是5. ...
- 剑指offer面试题12-打印1到最大的n位数
题目: 输入一个数字n,按顺序打印出从1最大的n位十进制数.比方输入3,则打印出1.2.3最大的三位数即999 这道题的主要陷阱就在大数的处理,仅仅要将这个考虑进去,用字符串来表示.就好说了. 那差点 ...
- Linux清理磁盘空间
1.首先确定是否是磁盘满了 命令: df -h 参数说明: -a:列出所有的文件系统,包括系统特有的/proc等文件系统 -k:以KB的容量显示各文件系统 -m:以MB的容量显示各文件系统 -h: ...
- JDBC一(web基础学习笔记七)
一.JDBC Java数据库的连接技术(Java DataBase Connectivity),能实现Java程序以各种数据库的访问 由一组使用Java语言编写的类和接口(JDBC API)组成,它j ...
- Tomcat环境的搭建(web基础学习笔记一)
一.下载和安装Tomcat服务器 下载Tomcat安装程序包:http://tomcat.apache.org/ 点击[Download]跳转到如下图所示的下载页面 二.点击左侧要下载的版本,选择To ...
- Jetty:配置上下文
这篇文件讲述配置Jetty上下文的各种选项. 设置上下文路径 上下文路径是一个URL路径的前缀,用于将一个输入请求相应到相应的上下文.Java Servlet Server的URL通常的格式为:htt ...
- 短信api接口
1.需要用到的结构 typedef struct _SM_PARAM { char SCA[16];//+8613552678753// 短消息服务中心号码(SMSC地址) char TPA[16]; ...