C++之#progma pack预处理
来源:互联网 发布:日本观光局数据 编辑:程序博客网 时间:2024/05/05 04:54
#progma pack ([n])表示内存对齐,目的是为了优化内存,减少内存碎片,使得内存按照一个固定的规则进行分配,让分配的内存总是n的倍数,避免随意分配内存大小。举个例子,我们在Visual C++中编写如下的类,
class X
{int a;
char b;
short c;
};
那么sizeof(X)等于多少?有人会说,很简单,sizeof(X)=4+1+2=7。有这种想法的朋友不妨到Visual C++中去试一试;认为sizeof(X)等于8的朋友,恭喜你们答对了,下面我们简单的分析一下原因。在Visual C++中有起始地址对齐的倍数规则,内容是各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为改变量的类型所占字节数的倍数。如下图所示,
图1 分配方式的对比
从图1中,我们可以看出,a和b的分配方式是相同的。根据起始地址对齐的倍数规则,如果c的偏移量为5,而c所占字节数为2,所以c的起始地址不能是5,而是6。
我们回过头来,说说progma pack吧。progma pack有两个规则:对齐长度规则和圆整规则。
1)对齐规则
结构、联合体或者类的数据成员的第一个放在偏移量为0的地方,以后每一个数据成员的对齐按照#progma pack制定的数值和这个数据成员的类型长度中取比较小的哪个值进行对齐。
例如#progma pack(4),使用上一例的Class X,那么sizeof(X)=8,根据对齐规则,按照指定的数值长度(4)和c的数据类型长度(2)中取较小者,那就是2,于是c按照2的倍数来对齐,也就是起始地址为6的位置。
2)圆整规则
在声明#progma pack(n)的情况下,整个数据类型的长度必须为n的倍数。例如我们编写如下的类Y,
class Y
{int a;
char b;
short c;
char d;
};
那么正常情况下,以及在对齐规则和圆整规则下内存分配方式如图2所示。
图2 对齐规则和圆整规则
经过简单地讲解,我想大家应该清楚#progma pack的作用了,那各位晚安了,好困呀……
- C++之#progma pack预处理
- C++之#progma pack预处理
- #define / #undef /#progma 预处理器
- 预编译指令#progma pack与sizeof()
- c语言之预处理
- C语言之预处理
- 《C预处理》之#ifndef
- C语言程序设计之预处理
- C之预处理
- C语言之预处理
- C语言之预处理
- C语言之预处理
- C语言之预处理
- C语言之预处理
- C语言之预处理
- C语言学习之预处理
- 8.C语言之预处理
- C语言之预处理命令
- Java的动态绑定机制
- 微软等数据结构+算法面试100题(43)-- 把二元查找树转变成排序的双向链表
- 使用批处理添加受信任站点和设置ie安全级别
- android run as 出现 .. 的各种问题
- iphone开发 音频播放
- C++之#progma pack预处理
- 快速排序
- 微软等数据结构+算法面试100题(44)-- 求子数组的最大和
- java技术总结
- C++继承中的虚析构函数
- volatile关键字的作用
- MySQL统计函数记录——GROUP_CONCAT()函数
- larbin的编译 运行+三个配置文件阅读
- 开源加密解密库比较