为了加快对结构体成员的访问,编译器对结构体进行内存对齐,结构体大小往往大于成员字节数的总和。
结构体大小计算原则
1. 确定每个成员的字节数
2. 第一个成员在结构体偏移量为0的位置(起始下标从0开始)
3. 当前成员的偏移量是当前成员所占大小的整数倍(即当前成员的起始下标%sizeof(当前成员)== 0)
4. 结构体总大小是成员最大字节数的整数倍
struct Test {
int id; // 4
char name[5]; // 5
char age; // 1
};
printf("%d\n", sizeof(struct Test)); // 12
步骤:
1. int: 0(偏移)+ 4(字节)
2. char [5]: 0(偏移)+ 4(字节)+ 1(偏移) + 5(字节)
3. char:0(偏移)+ 4(字节)+ 1(偏移) + 5(字节)+ 0(偏移)+ 1(字节)= 11
4. 最大字节数是4,要补充1个才是4的整倍数,所以是12
测试
struct Test {
char age; // 1
int id; // 4
char name[5]; // 5
};
printf("%d\n", sizeof(struct Test)); // 16
步骤:
1. char: 0(偏移)+ 1(字节)
2. int: 0(偏移)+ 1(字节)+ 3(偏移) + 4(字节)
3. char [5]:0(偏移)+ 1(字节)+ 3(偏移) + 4(字节)+ 2(偏移)+ 5(字节)= 15
4. 最大字节数是4,要补充1个才是4的整倍数,所以是16
struct Test {
char name[5]; // 5
char age; // 1
int id; // 4
};
printf("%d\n", sizeof(struct Test)); // 12
步骤:
1. char [5]: 0(偏移)+ 5(字节)
2. char: 0(偏移)+ 5(字节)+ 0(偏移) + 1(字节)
3. int:0(偏移)+ 5(字节)+ 0(偏移) + 1(字节)+ 2(偏移)+ 4(字节)= 12