struct的对齐


关于struct对齐的问题,很多用来做例子的一个典型

#pragma  pack(8)

  
struct  s1... {
  
short a;
  
long b;
  }
;

  
struct  s2... {
  
char c;
  s1 d;
  
double e; // long long 类型 vc6 好像没有
  }
;

#pragma  pack()


  问
  1.sizeof(s2) = ?
  2.s2的s1中的a后面空了几个字节接着是b?

现在google看到的答案都是

       1. 24
       2. 2

所说的理由如下:
    成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.
      也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节
        S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;
  S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节.


-------------------------------------------------------------------------------------------------------------------------------------------------------

这是我测试得到的

答案:

vc 6 下
       1. 24
       2. 2

gcc version 2.95.4 20020320 [FreeBSD]  / gcc version 3.4.6 [FreeBSD] 20060305  下
      1.   20
      2.   2

gcc 下struct 变成这样(红色部分),答案两者就一致了。

#pragma  pack(8)

  
struct  s1... {
  
short a;
  
long b;
  }
;

  
struct  s2... {
  
char c;
  s1 d;
  
double e;
  }  __attribute__ ((aligned (8)))
;

#pragma  pack()

可能除了pack,aligned还是有用的。。另 pack中的数字只能为1,2,4,8,16
----------------------------------------------------------------------------------------------------------------------------------------------------

struct aligned 的目标是提高地址访问的效率,可能导致的问题是在数据类型强制转换时(本质还是内部成员的地址问题)出现的问题。典型的把struct 对象从原端通过网络传递到对端,再还原为struct。这个可能对端的操作平台、编译器等对struct的实际处理是不一致的。。


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值