关于偏移量:
1.结构体变量中成员的地址偏移量为上一个成员的偏移量加上一个成员的大小。
2.结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。
关于存储变量地址对齐
编译器在编译程序时会遵循两条原则:
1、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
2、结构体大小必须是所有成员大小的整数倍。
举例:
struct ssd
{
float a; 地址偏移量 0(首地址)
int b; 地址偏移量 4(0+4)
char c; 地址偏移量 8(4+4)
char d; 地址偏移量 9(8+1)
float e; 地址偏移量 10(9+1)
};
答:
原则1:不满足,e地址偏移量10不是成员大小(4)的整数倍
原则2:不满足,结构体大小为14不是所有成员大小(4/1)的整数倍
故:编译器会自动为e补充2个空字节
即 float e; 地址偏移量 12(9+1+2)
原则1:满足,e地址偏移量12是成员大小(4)的整数倍
原则2:满足,结构体大小为16是所有成员大小(4/1)的整数倍
总结:计算结构体长度时应注意结构体成员间数据对齐要求,如果单纯按照结构体成员大小计算会造成数据丢失。
参考:https://blog.csdn.net/jueduiwudi6/article/details/80721108?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_utm_term~default-0.no_search_link&spm=1001.2101.3001.4242.1