结构体字节对齐
//提示:32位STM32中,int是4字节,double为8字节。
#pragma pack(8) //指定对齐方式:8字节对齐
typedef struct{
char name[3];
int age;
double score;
}Student;
typedef struct{
char name[3];
double score;
int age;
}Engineer;
typedef struct{
char name[3];
char height;
double score;
int age;
}Teacher;
求:
printf("%d",sizeof(Student));
printf("%d",sizeof(Engineer));
printf("%d",sizeof(Teacher));
//答案:16,24 ,24
student:
32位的寄存器是4个字节
- 首先给name分配空间,name[0]占一个字节
- name[1]占一个字节
- name[2]占一个字节
- 给age分配空间时,age占四个字节,于是,char[3]为了对齐,也要占四个字节,于是name[0]、name[1]、name[2]各自占一个字节,之后空出一个字节,总共占用四个字节,然后age占用4个字节
- 给score分配空间,score占用两个32位,即8个字节
总共占用4+4+8=16个字节
Engineer:
- 首先给name分配空间,name[0]占一个字节
- name[1]占一个字节
- name[2]占一个字节
- 给score分配空间时,score占8个字节,于是,char[3]为了对齐,也要占8个字节,于是name[0]、name[1]、name[2]各自占一个字节,之后空出5个字节,总共占用8个字节,然后score占用8个字节
- 给age分配空间,为了与score对齐,占用8个字节,空出4个字节
总共占用8+8+8=24个字节
Teacher:
- 首先给name分配空间,name[0]占一个字节
- name[1]占一个字节
- name[2]占一个字节
- 给high分配,与char对齐,占用一个字节,刚好把name空出的一个字节占下,这个总共分配四个字节
- 给score分配空间时,score占8个字节,于是,char[3]与high为了对齐,也要占8个字节,于是name[0]、name[1]、name[2]、height各自占一个字节,之后空出4个字节,总共占用8个字节,然后score占用8个字节
- 给age分配空间,为了与score对齐,占用8个字节,空出4个字节 总共占用8+8+8=24个字节
总结,写结构体的时候,把字节占用小的数据变量写在前面,可能会省空间