字节对齐

今天下午权哥忽然发过来一道题,后来说明是网上流传的一道关于字节对齐的题,很久没做了。尝试着想啊想啊做了下。也算做出来了
#pragma pack(8)

  struct s1{
  short a;
  long b;
  };

  struct s2{
  char c;
  s1 d;
  long long e;
  };

  #pragma pack()

  问
  1.sizeof(s2) = ?
  2.s2的s1中的a后面空了几个字节接着是b?
回忆中的思路是:
s1 short(2) long(4)
   0 1       2 3 4 5       6 7 8 9 10
   short     long                                   算错了

对齐的原则是取小 当前类型与pack(n)的字节数取小的那一个

short占两个字节后当前地址为2 long为四字节。可以被整除2 所以不用添字节
所以  sizeof(s1) = 6                            算错了


这个地方算错了。。非常对不起大家。。重写的那天。。头晕。。按1字节算了
也多谢朋友的提醒,以后一定注意.

重新修正为

s1 short(2) long(4)
 0 1       2 3    4 5 6 7
short      补          long

对齐的原则是取小 当前类型与pack(n)的字节数取小的那一个
short占两个字节  long是占四个字节。所以需要当前地址可以被4整除  所以。。补两个字节
所以  sizeof(s1) =8



然后来算s2
char(1)  s1被拆分 (short(2) long(4)   结构体拆分后按最大字节对齐)  longlong(8)

 0        1 2 3          4567    8 9 10 11  12 13 14 15   16 17 18 19 20 21 22 23 
 char      补           short          long          补              longlong
所以sizeof(s2)=24
a后面空了2个字节接着是b

应该是没有问题的 还有一点。。如果最后位数不够的话。。。是按packer和结构体两个最小的字节数补齐

posted on 2007-10-15 21:43 Randy 阅读(544) 评论(2)  编辑 收藏 引用

评论

# re: 字节对齐 2007-10-19 21:35 aaa

这个答案对吗?sizeof(s1)=6?  回复  更多评论   

# re: 字节对齐 2007-10-20 15:46 Randy

啊。。对不起。。。看了一下。。。错了。。。Sorry啊。。。。。呵呵,,以经改正了  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2007年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿(3)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜