我们在创建一个结构体时,是否想过他的大小是多少呢?
这个结构体占多少个字节?如果没有内存对齐现象,我们可能会想当然的认为这个结构体的大小等于int+int+char即9个字节,实际上是这样吗,执行程序我们会发现
为什么是12个字节?这就是因为在c语言中,结构体存在着一个内存对齐的现象,那么如何去正确地计算结构体中的大小呢,下面将为你介绍。
1.结构体的第一个成员出现在结构体变量偏移量为0的地址
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处(一个成员的对齐数就是编译器默认的对齐数与该成员的大小的较小值,VS编译器的默认对齐数是8,因此以int型为例,int型大小是4,4<8,因此vs下int成员的对齐数是4)
3.结构体的总大小是所有成员的对齐数里最大对齐数的整数倍。
接下来,我们以上图为例
假设s1变量存放在该处,那么s1下的每个字节相对于起始地址的偏移量就如图所示
那么我们已经知道int占4个字节,也就是
然后char类型的对齐数是1,那么就从该对齐数的整数倍开始,4也是1的整数倍,因此从4开始,char占一个字节
然后是int类型的对齐数是4,那么就该从4的整数倍开始,也就是8开始存放int型数据,占4个字节
存放完毕后,别忘了还有第三个要求,即结构体大小要是成员对齐数里最大对齐数的整数倍,成员里最大对齐数是4,我们发现当前结构体是12个字节,正好是4的整数倍!如果当前目前的结构体大小是13或14或15个字节,它就需要对齐到4的整数倍,也就是需要占用16个字节!
那么接下来尝试计算下面这个结构体的大小
答案是24个字节(不要忘记最后要是最大对齐数的整数倍!)
那么如果结构体嵌套了一个结构体呢,此时又该怎么计算,此时新增一条规则以便于理解。
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
什么意思呢,接下来实操一遍,如下图。
s1的大小怎么计算呢,首先我们先需要算出s2成员的大小,通过以上的教学,相信你不难算出s2的大小是12。然后我们知道s2的里面各成员的最大对齐数是4,那么也就是说,s1中的s2成员变量的最大对齐数就是4,然后不难计算得出装下s1的各个成员变量需要25个字节,但是!!需要知道结构体整体的大小需要是最大对齐数的整数倍,最大对齐数是4,那么该结构体就需要28个字节存储!