以前好几次,我都发现一个问题,为什么同样的结构体,成员变量书写的顺序不一样,它的sizeof(struct)就不一样呢。当时很纳闷,于是就问公司一老员工。他说这是因为数据类型对齐的原因,但具体又说不出个所以然,就告诉我,可以自己修改数据的对齐参数。方法如下:
#pragma pack(push)
#pragma pack(1) //自定义的数字
#pragma pack(pop)
当时我也就照着做了,后来自己一查资料,才明白怎么回事呢。原来所谓的对齐,就是内存对齐,方便cpu读取数据。如果自己没有自定义对齐方式的话,那么就采用的是系统默认的对齐方式了。32位的系统默认为4个字节。
具体来说,分为2部分:
1、数据自身的对齐。像char这样的1字节数据类型在这个环节就无所谓了。2字节以上的数据的话,就得遵循这个规则:内存地址必须是数据类型长度的整数倍。比如:
struct test
{
char c1;
int i2;
};
这个结构体的长度为8。为什么呢?因为c1占1位,假设内存地址为(0x0),i2本身占4位,但它的内存地址必须是4的整数倍。所以,只有在它之前,即c1之后添上3个空字节。那么,i2的内存地址就为(0x4)。
2、结构体自身对齐。数据自身对齐以后,得到的结构体长度还不一定是最终的结构体长度。因为这里又有两种情况了:
(1)如果结构体中的最长数据类型长度小于它设定的对齐长度(如果我们没有自定义长度,那么,在32位系统下,就跟4比较),那么,结构体的长度必须是该数据类型长度的整数倍,否则自动补齐(在其后添空字节);
(2)如果该长度大于等于设定的长度,那么,结构体的长度就必须是设定长度的整数倍,否则自动补齐(在其后添空字节)。
以上是我自己结合实际应用中的一点理解,如果想看详细解释,推荐看一下这个链接:
阅读(1743) | 评论(0) | 转发(0) |