为了提高CPU的存储速度,编译器对一些变量的起始地址做了”对齐”处理。在默认情况下,编译器规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
- 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
- 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
- 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
struct MyStruct{
double dda1;
char dda;
int type
};
sizeof(MyStruct) 为 8+1+3+4=16
struct MyStruct{
char dda;
double dda1;
int type;
};
sizeof(MyStruct) 为 1+7+8+4+4=24