Chinaunix首页 | 论坛 | 博客
  • 博客访问: 293575
  • 博文数量: 26
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 502
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-31 22:53
文章分类

全部博文(26)

文章存档

2011年(2)

2010年(21)

2009年(2)

2008年(1)

我的朋友

分类: WINDOWS

2010-05-17 15:17:06

   由于编译器的不同,对于四字节对齐的定义就不同,有的编译器会自动补齐成四字节,有的不会。这样会造成交叉编译时不兼容。因此在设计数据结构时,应该尽量设计成4字节的倍数。

对齐规则:

char                       在字节边界上对齐             N=1
short (16-bit)         在双字节边界上对齐          N=2
int (32-bit)              在4字节边界上对齐            N=4
long (32-bit)           在4字节边界上对齐           N=4
float                        在4字节边界上对齐            N=4
double                    在8字节边界上对齐           N=8

注: 在结构体中 N 取最大值

如: struct    {char    a;    char    b;}    T;  
   struct    {char    a;    int    b;}    T1;

sizeof(T)    ==    2;    N    =    1    没有填充  
sizeof(T1)    ==    8;    N    =    4    中间填充了3字节  


      对齐方式影响结构体成员在结构体中的偏移设编译器设定的最大对齐字节边界数为n,对于结构体中的某一成员item,它相对于结构首地址的实际字节对齐数目X应该满足以下规则:  
   
   X    =    min(n,    sizeof(item))  
   
   例如,对于结构体    struct    {char    a;    int    b}    T;  
   
   当位于32位系统,n=8时:  
   a的偏移为0,  
   b的偏移为4,中间填充了3个字节,    b的X为4;  
   
   当位于32位系统,n=2时:  
   a的偏移为0,  
   b的偏移为2,中间填充了1个字节,b的X为2;  

另外,多个成员加在一起,字节数还小于N的,要合并一起补齐

如 struct {char a; char b; int i;} t1;   N=4 sizeof (t1)==8


有趣的例子:

struct {char a ; int i; char b;} t1;

struct {char a; char b; int i;} t2;

sizeof(t1)==12   

sizeof(t2)==8

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