结构体默认对齐方式
在默认对齐方式下,结构体成员的内存分配满足下面三个条件
1.第一个成员的地址和结构体的首地址相同,即偏移量为0。
2.结构体每个成员地址相对于结构体首地址的偏移量(offset)是该成员大小的整数倍,如果不是则编译器会在成员之间添加填充字节(internal adding)。
3.结构体总的大小是其成员中最大基本类型大小整数倍,如果不是编译器会在其末尾添加填充字节(trailing padding)。
offsetof函数可以得到结构体成员相对于该结构体首地址的偏移量
struct s0{
}//sizeof(s0)=1
struct s1{
char ch; //offsetof(s1, ch)=0;
int a; //offsetof(s1, a)=4
double b; //offsetof(s1, b)=8
char c1; //offsetof(s1, c1)=16
}; //sizeof(s1)=24
struct s2{
char ch; //offsetof(s2, ch)=0
int a; //offsetof(s2, a)=4;
double b; //offsetof(s2, b)=8;
}; //sizeof(s2)=16
struct s3{
char k0; //offsetof(s3, k0)=0
char k1[9]; //offsetof(s3, k1)=1
double k2; //offsetof(s3, k2)=16
};//sizeof(s3)=24
struct s4{
char k0; //offsetof(s4, k0)=0
char k1[9]; //offsetof(s4, k1)=1
char k2; //offsetof(s4, k2)=10
};//sizeof(s4)=11
sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof( trailing padding )
union类型满足1和3,所有成员偏移量都为0;