基本概念:
在求解结构体大小之前,我们需要明白一个概念:
对齐:
计算机中内存空间都是按照字节byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。如果一个变量的内存地址正好位于它长度的整数倍,被称做自然对齐。
数据类型自身的对齐值:
对于char型数据,其自身对齐值为1,对于short型为2,对于int,float等类型,其自身对齐值为4,单位字节。
结构体自身对齐值:
其成员中自身对齐值最大的那个值。
对齐规则
1.成员按照自身的对齐值对齐:如果不在对齐边界,编译器会在加上填充字节
2.结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字
举例:
求这个结构体的大小。
常规思维(错误):
因为int 字节大小是4,char,double分别为1和8,所以4+10+1+4+8=27
正确思路:
如图:
是在计算机中的具体表现形式。
由以上可得:先是int,所以先给int四个字节,其次是char[10],1的整数倍是除0以外的自然数,所以就顺的填补到int的后面,char sex也是,而序号15,那个空白的格子是系统自己填补的,原因是下一个int类型,需要放在4的整数倍,同理,下一个类型double类型,需要放到8的倍数上,然而序号20不满足,系统会填补,最后放到了24上,所以最后的大小为32。
练习:
提示:
结果为28.