想要计算结构体大小,咱就先要清楚结构体内存对齐的规则:
1.结构体的第一个成员直接对齐到相对于结构体变量起始位置为0处偏移。
2.从第二个成员开始,要对齐到某个【对齐数】的整数倍的偏移处。
3.结构体的总大小,必须是最大对齐数的整数倍。每个结构体成员都有一个对齐数,其中最大的对齐数就是最大对齐数。
4.如果嵌套了结构体的情况。嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
一、简单结构体对齐数的计算
首先,一般都是向较小的数取对齐数,例如,int大小为4,系统指定的对齐数为8. 8 > 4,所以取4为对齐数,就像:
红色和绿色的是存了的地址,白色的就是浪费的空间,所以说对齐方式很浪费空间,可是按照计算机的访问规则,这种方式提高了效率。
从上可以看出,该结构体的大小为:1 + 4 + 1 + 3(浪费的空间(白色)) = 9,然后通过法则三知道9是不行的,要偏移到12,因为总大小要是最大对齐数的整数倍。
综上 结构体的大小为:1 + 4 + 1 + 3 + 4(偏移的大小) = 12.
二、成员包含数组的结构体计算
我们有了上面的基础对于这个带数组的结构体就很好计算了。
加了一个char类型的数组,可以看作有5个char类型的存入内存中,然还要满足结构体总大小为最大对齐数的整数倍
综上结构体的总大小为:1 + 3 + 4 + 1 + 5 + 2 = 16
看到这是不是感觉计算没有那么难!!如果会了给来点鼓励嘿嘿以后继续更新!!
三、结构体包含结构体的结构体大小
结构体包含结构体有点绕,但是看我的之后就不会啦,咱继续往下看!!
对于结构体中的结构体,关键的是把对齐数找到,可以看出SS结构体的大小为8,但是对齐数总大小不是按8为倍数的而是按4的的这就说明,结构体的大小在结构体中不会与指定对齐数进行比较,所以就可以把结构体SS看作是一个char和一个int类型。
综上 结构体的总大小为:1 + 3 + 4 +1 + 3 + 4 + 1 + 3(偏移量) = 20
四、结构体中包含联合体的结构体大小
咱再算结构体包含联合体之前,我先啰嗦几句,先把联合体的大小计算给还不知道的小伙伴讲一讲:
分支 联合体的大小计算:
在这之前咱先了解一下联合体大小计算规则:联合体中最大成员所占内存的大小且必须为最大类型所占字节的最小倍数。
了解规则后咱来看看代码:
1.联合体U char ch数组(可以看作10个char)占10个空间,double占8空间,int占4空间,最大的是double单个占8个空间。
由于联合体大小计算规则是按 最大的 最小倍数 也就是8的最小倍数能装进去char ch数组(大小是10 一个8装不下),所以咱就用两个8,16个空间就能装下啦。
2.联合体I char ch数组(看作7个char)占7个空间,double占8个空间,int占4个空间,最大的还是double单个占8个空间。
可以看出来double占的空间还是最大的,没有比8大的空间,所以一个8就够用!
综上所述联合体U:8 + 8 = 16 联合体I:8
咱回归正题,来计算结构体中的联合体大小
联合体在结构体里面比较特殊,他可以作为最大的对齐数,联合体大小为8,系统指定的对齐数为8,所以最大为8,然后可以根据上面的内存格子数一数。
综上结构体的大小为:1 + 3 + 4 + 8 + 1 + 7(偏移量) = 24
想必现在的你已经无敌啦!!!如果会了的话不要吝啬你的赞和好评哟!!
如果有错误或者见解,请各位快快指出!!o(* ̄▽ ̄*)ブ
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)