数据结构的对齐

linux的对齐策略是 2字节数据类型的地址必须是2的倍数,而较大的数据类型(例如 int, int *, float, double,long long)的地址必须是4的倍数.
windows的对齐策略更加严格,认可k字节基本类型对象的地址都必须是K的倍数.

结构体的对齐,除了每个结构体成员对齐以外,还要满足,结构体的大小是结构体中最大对齐字节的倍数.结构体本身的对齐以结构体中所有成员中最大的对齐字节来进行.

struct S1 {
  char c;   
  double i;
};
struct S2 {
  char c1;    
  S1 s;    
  char c2;
};

在linux 中, double的对齐字节是4,而linux中,double的对齐字节是8

linux 中,上面的S1的字节数是12,S2的字节数是20
windows中,上面的S1的字节数是16,S2的字节数是32

存在#pragma pack宏的对齐( 另外,在GNU C中还有一个 __attribute__ ((aligned (N)))    指令,可以达到类似的效果。 )
?
1
2
#pragma pack (n)  //编译器将按照n个字节对齐
#pragma pack ()   //取消自定义字节对齐方式
对齐规则:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和自身对齐模数中较小的那个。

例8:按指定的对齐模数
?
1
2
3
4
5
6
7
8
#pragma pack (2) /*指定按2字节对齐*/
struct G{
   char b;
   int a;
   double d;
   short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
在结构体G中成员变量的最大对齐模数是sizeof(double)=8;又因为指定对齐模数是2;所以取其较小者2为结构体G的最大对齐模数;则sizeof(G)=2+4+8+2=16;由于16是2的整数倍,则不需要填充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值