zoukankan      html  css  js  c++  java
  • 结构体字节对齐

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

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

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

  • 相关阅读:
    子字符串substring 问题
    [Coding Practice] Maximum number of zeros in NxN matrix
    挖一挖unsigned int和补码
    1. 概览
    1. 概览
    Linux sudo 命令的应用
    将秒转化为时分秒
    PHP 信号管理
    HTTP Cache
    Linux 文件压缩与归档
  • 原文地址:https://www.cnblogs.com/hhsxy/p/14018372.html
Copyright © 2011-2022 走看看