结构体对齐

结构体对齐问题

 


 

以下结论均在GNU GCC上验证

 


 

 

概念:

 偏移量——成员地址相对结构体地址的偏移

 

 

对齐原则:

1. 结构体中某成员的偏移量必须是该成员类型大小的整数倍

 

 

>>b 的偏移量必须是 short 大小的整数倍, 故在 a 后面填充一个字节;

>>c 的 类型大小是double, 在ANSI C中, c 的偏移量是8的倍数(未验证), 在GNU中,大于4的类型按照4来处理,故c开始的偏移  量为4,在b后面无须填充。

>>sizeof(st1)= 12; (注: 在x86 32上 gcc 编译的结果 在64位机器上编译成64位程序,结果是16,。 以下结果都是在x86 32 平台上编译)

 

2.结构体大小必须是最大成员基本类型(如3中情况,则将成员结构体中基本类型的大小考虑进去)的整数倍

>>sizeof(st2) = 12;

 

3.结构体中含有结构体,则成员结构体的偏移为该结构体中最大类型大小的整数倍(GNU中大于4的按照4来处理,pragma pack() 预编译指令有关,,未验证

 

>>sizeof(stu) = 20;

 

4.关于结构体位填充字段:位段类型只能是int ,char ,unsigned int 三种;位填充成员偏移量不受1的限制,即之前无须填充,数据紧跟在上一成员之后; '类型名:0'表示该类型大小(大于4字节按4字节(GNU))对齐;结构体大小满足2中描述,即位段类型的整数倍。

 

 

>>sizeof(st4) = 8;

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值