Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1619985
  • 博文数量: 268
  • 博客积分: 8708
  • 博客等级: 中将
  • 技术积分: 3764
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-06 15:58
文章分类

全部博文(268)

文章存档

2014年(1)

2013年(15)

2012年(23)

2011年(60)

2010年(51)

2009年(12)

2008年(59)

2007年(47)

分类:

2010-12-22 11:07:20

为了加快计算机的取数速度,编译器默认对内存进行字节对齐。对结构体(包括类)进行字节对齐的原则是:

1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);

3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。

  1. struct SByte1  
  2. {  
  3.     double d;    // 偏移量0~7  
  4.     char j;      // 偏移量8  
  5.     int a;       // 偏移量12~15,由于9不能整除4,故先填充9~11  
  6. };   
  7. sizeof(SByte1);  // = 16  
  8.   
  9. struct SByte2  
  10. {        
  11.     char j;      // 偏移量0  
  12.     double d;    // 偏移量8~15,由于1不能整除8,故先填充1~7  
  13.     int a;       // 偏移量16~19  
  14. };   
  15. sizeof(SByte2);  // = 24,为了凑成8的倍数,填充20~23 

struct B {

    int a;           //对其系数4

    char b;       //对其系数1

    short c;     //对其系数2

};//整体对其系数4

sizeof(strcut B)=8


struct C {

    char b;   //对其系数1 0~3

    int a;      //对其系数4 4~7

    short c;  //对其系数2 8~9

};//整体对其系数4

sizeof(struct C)=12 本应该是10为了规则3,所以补2字节


#progma pack (2)

struct D {

    char b;    //对其系数min(长度=1,n=2)=1

    int a;       //对其系数min(长度=4,n=2)=2

    short c;   //对其系数min(长度=2,n=2)=2

};//整体对其系数2

#progma pack (2)  对int a的放置产生影响,

#progma pack (n)  只能取1、2、4

因此 sizeof(struct D)=8


  1. #pragma pack(push) //保存对齐状态  
  2. #pragma pack(4)    //设定为4字节对齐  
  3. class CByte  
  4. {  
  5.     char c;        //偏移量0  
  6.     double d;      //偏移量4~11,由于1不能整除4,故先填充1~3  
  7.     int i;         //偏移量12~15  
  8. };  
  9. #pragma pack(pop)  //恢复对齐状态  
  10. sizeof(CByte); // = 16 

阅读(869) | 评论(0) | 转发(0) |
0

上一篇:shell批量操作文件后缀

下一篇:Valgrind

给主人留下些什么吧!~~