• 结构体大小的计算 用最简单的方法,通俗易懂的方法计算结构体大小


    结构体计算要遵循字节对齐原则

    结构体默认的字节对齐一般满足三个准则:

    1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

    2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);

    3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)

    其实 暂且不管这三原则,我的方法只要记住第三个,就是结构体大小结果要为成员中最大字节的整数倍

    先看下面定义的两个结构体.

    struct {   char a;   short b;   char c; }S1;

    struct {  char  a;  char  b;  short c; }S2;

    分别用程序测试得出sizeof(S1)=6 , sizeof(S2)=4

    注意 为什么 仅仅改变了结构体成员的顺序,结果不一样?

    解:

    (1)首先找出成员变量中最大的字节,可见对于S1和S2 最大是short ,占2个字节,

      (2)所以以后都已2个字节为准,也就是说最多只要2个字节,其他填充占位,注意下图一个格子表示一个字节,

        (3)所以先画2个格子,以后看成员顺序,逐次增加,每次一2为增加基准

        对于S1 ,来说,顺序是 char->short->char      

    2个字节
    第一个char占一个字节     多的这一个补0,只是占位作用
    short 刚好占2个字节  
    第二个char也占1个 多的这一个补0

    所以对于S1结构体大小为 2*3=6,至于为什么第二个char,多的那个字节不丢到,就是遵循第三个原则,就是结构体大小结果要为成员中最大字节的整数倍

    对于S2 嘛,也画个图,但是顺序是 char->char->short

    第一个char占一个字节 第二个char占一个字节
    short 刚好占2个字节  

    S2=2*2=4

    按照这个方法再看这样的一个结构体:

    struct stu1
             {
                   int i;
                                 char c;
                   int j;
             };

    很明显:最大字节为4个。顺序int  char int

     

    stu1
    int int int int
    char 0 0 0
    第二个int int int int

    因为 int占4个,而char已经咱了一个,不够,所以那三个只能多余占位

    Stu1=3*4=12

    那么换一下呢?

    struct stu2
             {
                   int i;
                               
                   int j;

                char  c;
             };

    Stu2=3*4=12;

    再看一个:就是当结构体成员变量是另外一个结构体时,只要把结构体中成员为另一结构体作为整体相加就行

     

    typedef struct A
    {
    char a1;
    short int a2;
      int a3;
      double d;

    };

    A=16

    typedef struct B
    {
    long int b2;
    short int b1;
    A a;

    };

    而对于B,先不要管A a,也就是先去掉A a 成员结构体B 算得 其为8,所以最后结果为8+16=24;24才是最后结果

     

     

     

  • 相关阅读:
    最全QQ空间说说伪装代码
    Office文件找回技巧
    CentOS7安装CMake(arm版)华为云服务器
    centos7修改ssh端口
    CentOS7安装zookeeper(ARM)版——华为服务器
    CentOS7安装JDK1.8
    Centos7安装Docker
    Prometheus+mysqld_exporter
    Prometheus+blackbox_exporter
    Prometheus+node_exporter
  • 原文地址:https://www.cnblogs.com/lykbk/p/krtmbhrkhoirtj9468945.html
Copyright © 2020-2023  润新知