结构体大小的计算方法

Posted 不倒翁*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体大小的计算方法相关的知识,希望对你有一定的参考价值。

结构体大小的计算方法

相信来看这里的小伙伴们,应该都知道了计算一些基本类型的数据的大小。
比如,int 占4个字节 ,char 占1个字节 ,short 占2个字节等等。那么结构体的大小怎么计算呢?
要想知道结构体大小是怎么计算的,我们必须知道结构体的对齐规则,对齐规则主要包括一下4点:
1.第一个成员在与结构体变量偏移量为0的地址处。

2.其他成员变量要对齐到对齐数的整数倍的地址处。对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。 VS中默认的值为8

3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
(重点看我代码里面注释的分析是怎么计算的)
可能看了这4条规则你还是不懂怎么计算,下面我来举几个列子:(会在代码里面注释是怎么算的)

//看看这个结构体的大小为多少呢?
struct S1

   //首先我们知道char 占一个字节
    char c1; //那么首先遵从第一条规则,就是从0开始算起,然后char占一个字
             //节,所以这里就是为1了;
    int a;//然后int占4个字节,本来要从第二个字节开始算,
           //但我们先看看上面第二条规则,
           //要对齐到对齐数的整数倍的地址处来开始计算,
           //这里的对齐数为4,因为4比8小,所以我们
           //要从第四个字节来开始计算,加上int的4个字节就是4+4=8了
    char c2;// c2也占一个字节 8为1的整数倍,所以这里只要直接加1就好了,
           //就是9了
    //那么到这里是不是就结束了呢?结构体大小就是9?
    //当然不是的 接着我们看第3条规则结构体大小要为最大对齐数的整数倍
    //显而易见这个结构体的最大对齐数为4
    //所以这个结构体的大小就要把9扩大到4的整数倍 就是12了
    //所以这个结构体大小为12了。
;

看懂了上面是怎么计算的接下来再看看下面这个

struct S2

    char c1;
    char c2;
    int a;
;

先自己计算一下这个结构体大小为多少?
S2结构体的大小为:8
为什么是8呢? 我再来分析一个:
首先同样是从0开始计算,第一个为char类型,所以应该加1,然后第二个也是一个char类型,这时的最对齐数为1与8中的较小值, 所以对齐数就为 1了,所以这里是直接加1 就好, 然后为int类型占4个字节,对齐数为4,所以我们要从4的整数倍开始计算, 那就是从4开始往后加4就为8。接下来要判断8是不是这个结构体中的最大对齐数的整数倍呢,这个结构的最大对齐数为4,8是4的倍数,所以这个结构体的大小就是8了。

struct S3

    double d;  //8
    char c;  //8+1=9
    int i ;  //12+4=16
;

结构体S3的大小为:16 。
这个结构体大小怎么计算,你们也可以自己好好分析一下,我也在代码中简单注释了一下怎么算的

接下来看看这个结构体

struct S4

    char c;  //1
    struct S3  s3; //8+16=24
    double d;//24+8=32

S4这个结构体中包含了上面S3这个结构体,这个时候就要看看上面对齐规则的第4条规则了。
结构体S3中的最大对齐数为8 所以计算到结构体s3时,要从8开始计算所以是8+16=24;刚好24又为下一个double类型的对齐数(8)的整数倍,所以直接加8就为32 ,32又刚好是最大对齐数8的整数倍,所以S4结构体的大小就为32了。

上面都看完了的话,结构体大小的就算基本就没什么问题了哦。希望总结的这些能帮到你。

以上是关于结构体大小的计算方法的主要内容,如果未能解决你的问题,请参考以下文章

结构体大小的计算方法

Swift 的 结构体

内存字节对齐

内存字节对齐

WIN32中我新建一个cpp和.h 在头文件中写了一个结构体然后在.cpp文件中使用该结构体总是报错具体如下图

结构体在内存中的存储方式