Chinaunix首页 | 论坛 | 博客
  • 博客访问: 283991
  • 博文数量: 41
  • 博客积分: 2015
  • 博客等级: 大尉
  • 技术积分: 493
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-19 11:06
文章分类

全部博文(41)

文章存档

2011年(1)

2009年(40)

我的朋友

分类: C/C++

2009-03-16 16:30:16

    以前好几次,我都发现一个问题,为什么同样的结构体,成员变量书写的顺序不一样,它的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)如果该长度大于等于设定的长度,那么,结构体的长度就必须是设定长度的整数倍,否则自动补齐(在其后添空字节)。
   以上是我自己结合实际应用中的一点理解,如果想看详细解释,推荐看一下这个链接:

阅读(1681) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~