zoukankan      html  css  js  c++  java
  • 结构体大小的计算 用最简单的方法,通俗易懂的方法计算结构体大小

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

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

    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才是最后结果

     

     

     

  • 相关阅读:
    vmware ubuntu 异常关机无法连接到网络
    Speed up GCC link
    常用的一些解压命令
    Log4j 漏洞复现
    Test Case Design method Boundary value analysis and Equivalence partitioning
    CCA (Citrix Certified Administrator) exam of “Implementing Citrix XenDesktop 4”
    What is Key Word driven Testing?
    SAP AGS面试小结
    腾讯2013终端实习生一面
    指针的引用
  • 原文地址:https://www.cnblogs.com/lykbk/p/krtmbhrkhoirtj9468945.html
Copyright © 2011-2022 走看看