码迷,mamicode.com
首页 > 其他好文 > 详细

#pragma pack与数据内存布局

时间:2015-05-18 14:44:14      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

一,特征属性

#pragma pack(n)设置的是变量对齐的方式。在不同系统中默认值是不一样的,在Linux下默认#pragma pack(4),而在Windows下默认#pragma pack(8)。设置变量对齐方式主要是为了提高CPU存储变量的速度。
主要有如下几点:
1,各个成员按声明顺序存储,
2,每个成员分别按自己的方式对齐,比较成员类型与对齐参数n大小,取小对齐。
3,整个结构体长度必须是所有对齐参数的整数倍。

二,举例验证

A{
int a;
short b;
double c;
char d;
}
技术分享

分析:在Linux下默认PACK=4字节对齐,sizeof(int)=4,int占用4个字节,sizeof(short)=2 < PACK,根据最小原则按照2字节对齐,sizeof(double)=8>PACK,按照4字节对齐,在short后面空两个字节,从第八个字节开始对齐,char存放在第17个字节,因为第三条规则,按照4字节对齐,补足三个空字节,最后sizeof(A)=20
技术分享
分析:在Windows下默认PACK=8字节对齐,sizeof(int)=4,int占用4个字节,sizeof(short)=2 < PACK,根据最小原则按照2字节对齐,sizeof(double)=8=PACK,按照8字节对齐,在short后面空两个字节,从第八个字节开始对齐,char存放在第17个字节,因为第三条规则,按照8字节对齐,补足三个空字节,最后sizeof(A)=24

B{
char e;
short f
A s_a;
double g;
char h;
int i;
}
技术分享
分析:这里就不具体分析了,唯一不同的是这里A不是自带类型,sizeof(A) = 20<4,按照4字节对齐。
技术分享

三,定制数据布局

#pragma pack(push)
#pragma pack(n)
//你的数据结构
//
//
#pragma pack(pop)

通过上面的宏可以很方便的定义自己想要的数据布局。这在加速定制系统CPU存储变量速度,网络通信编程十分有帮助。#pragma pack(push) 是将系统默认对齐字节数入栈,#pragma pack(n)设置系统n字节对齐,#pragma pack(pop)恢复系统默认的对齐字节数。

#pragma pack(1)
这时,系统按照1字节对齐,也就是不空字节,所有的数据将一个接着一个的排列。
A:sizeof(int)+sizeof(short)+sizeof(double)+siezeof(char)=15
B:sizeof(char)+sizeof(short)+sizeof(A)+sizeof(double)+sizeof(char)+sizeof(short)=31

#pragma pack(16)
A:24字节,由于PACK=16字节对齐,当对齐double时,8字节对齐。根据第三条规则,结构体大小为所有对齐参数的整数倍,所以需要补齐7个空字节,结构体A占用了24个字节。
B:48字节,在short布局后,sizeof(A)=24>16,这时A按照16字节对齐,在short后面空12个字节,double,char,short布局后,依然需要保证结构体的长度是所有对齐参数的整数倍,也就是16的整数倍,补齐空字节后,sizeof(B)=48

#pragma pack与数据内存布局

标签:

原文地址:http://blog.csdn.net/lasercoder/article/details/45821841

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!