原则1. 各成员变量的偏移量必须为该成员大小的整数倍,如不够则在上一个变量后填充字节数
struct student
{
char name;
int id;
double score;
};
name 偏移量为0,成员大小为1,直接存;
id偏移量为1,成员大小为4,需要在前面补充3个字节;
score偏移量为8,成员大小为8,直接存;
所以sizeof(student)==16
原则2. 在所有成员计算以后,结构体的总大小—必须为成员变量中最宽类型的整数倍,如不够则在最后的变量后填充字节数
struct teacher
{
char name;
short age;
double salary;
int id;
};
name 偏移量为0,成员大小为1,直接存;
age 偏移量为1,成员大小为2,需要在前面补充1个字节;
salary 偏移量为4,成员大小为8,需要在前面补充4个字节;
id 偏移量为16,成员大小为4,字节存储;
sizeof(student)==20,但20不是double类型的整数倍,后面补充4个字节
所以 sizeof(student)==24
原则3. 复合型变量的偏移量必须为 该变量中最宽数据类型大小 的整数倍;
struct A
{
char v1; 1字节,后补7字节
double v2; 8字节
}; // 16字节
struct B
{
int v1; 4字节,后补4字节(因为struct A 最宽类型为8字节)
struct A v2; 16字节
char v3; 偏移量24,自接存
};
sizeof(struct B)==25, 但25不是 struct A 最宽类型为8字节 的整数倍,所以后补7字节
所以sizeof(struct B)==32.