结构体内存对齐遵循的原则
结构体的第一个成员永远都放在0偏移处
第二个成员开始以后的每个成员都要对齐到他们对应对齐数的整数倍上 对齐数是默认对齐数和自身大小较小的数
成员全放入后整体大小是所有成员变量中的对齐数的最大对齐数的整数倍数
结构体嵌套 嵌套的结构体要对齐到嵌套结构体本身成员变量的最大对齐数上 整体大小是两个结构体最大对齐数的整数倍
如图:
char c1的大小是1字节 从0偏移量处开始放入占1个字节
int a是4字节 vs下的默认对齐数是8字节 所以对齐数是4字节 从4字节的整数倍处开始对齐 就是偏移量是4的地方开始存储 占4字节 到偏移量7的位置
char c2大小是1字节 默认对齐数是8 所以对齐数是1字节 从1字节的整数倍开始对齐 偏移量8的位置是1的整数倍 占一个字节 总大小是0偏移到8偏移 一共9字节 不是最大对齐数4的整数倍 所以浪费3字节到偏移量为11的位置 0~11一共12字节是最大对齐数4的整数倍 所以总大小就是12字节
如上图: 结构体嵌套结构体
求s4的大小
char c1从0偏移开始 占1字节
嵌套结构体类型是对齐到嵌套结构体自身的最大对齐数的整数倍处 struct s3的自身成员中最大对齐数是8 所以嵌套结构体要对齐到8的整数倍处 那么就从8偏移处开始对齐占16字节 到23偏移处
double d的本身大小是8 默认对齐数是8 对齐数是8 从8的倍数开始对齐 24偏移是8的整数倍 占8个字节到31偏移处 此时大小是32字节 32个字节是两个结构体中最大对齐数8的整数倍 所以总大小是32字节