结构体大小的计算方法
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了。
上面都看完了的话,结构体大小的就算基本就没什么问题了哦。希望总结的这些能帮到你。
以上是关于结构体大小的计算方法的主要内容,如果未能解决你的问题,请参考以下文章