字节对齐三原则
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的 地址空间。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
概念: 指定对齐值、自身对齐值、有效对齐值
指定对齐值:编译器默认的 可以通过 #pragma pack() 修改指定对齐值
自身对齐值:char 1 int 4 short 2 double 4
有效对齐值:min(指定对齐值,自身对齐值)
存储的地址 偏移量%有效对齐值 ==0
例如:
struct ko
{
chra a; //有效对齐值1
int b; //有效对齐值 4
short c; //有效对齐值 2
}
sizeof(ko) 等于 12 (默认的指定对齐值4)
a 偏移量0 0%1 等于0
b 偏移量1 1%4 != 0 系统增加3个字节
c 偏移量8 8%2 等于 0
现在一共10 个 结构体对齐满足成员对齐最大值 4 10%4 != 0 系统增加2 一共是12个字节