结构体字节对齐

//提示: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个字节

  1. 首先给name分配空间,name[0]占一个字节
  2. name[1]占一个字节
  3. name[2]占一个字节
  4. 给age分配空间时,age占四个字节,于是,char[3]为了对齐,也要占四个字节,于是name[0]、name[1]、name[2]各自占一个字节,之后空出一个字节,总共占用四个字节,然后age占用4个字节
  5. 给score分配空间,score占用两个32位,即8个字节

总共占用4+4+8=16个字节

Engineer:

  1. 首先给name分配空间,name[0]占一个字节
  2. name[1]占一个字节
  3. name[2]占一个字节
  4. 给score分配空间时,score占8个字节,于是,char[3]为了对齐,也要占8个字节,于是name[0]、name[1]、name[2]各自占一个字节,之后空出5个字节,总共占用8个字节,然后score占用8个字节
  5. 给age分配空间,为了与score对齐,占用8个字节,空出4个字节

总共占用8+8+8=24个字节

Teacher:

  1. 首先给name分配空间,name[0]占一个字节
  2. name[1]占一个字节
  3. name[2]占一个字节
  4. 给high分配,与char对齐,占用一个字节,刚好把name空出的一个字节占下,这个总共分配四个字节
  5. 给score分配空间时,score占8个字节,于是,char[3]与high为了对齐,也要占8个字节,于是name[0]、name[1]、name[2]、height各自占一个字节,之后空出4个字节,总共占用8个字节,然后score占用8个字节
  6. 给age分配空间,为了与score对齐,占用8个字节,空出4个字节 总共占用8+8+8=24个字节

总结,写结构体的时候,把字节占用小的数据变量写在前面,可能会省空间

看不懂去看这篇,我感觉自己理解还是有点问题滴

posted @ 2020-08-19 15:02  火红色祥云  阅读(58)  评论(0编辑  收藏  举报