标签:
#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
标签:
原文地址:http://blog.csdn.net/lasercoder/article/details/45821841