结构体对齐问题
以下结论均在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;