关于结构体和类所占用的长度计算方式介绍。
在上例中,要计算 sizeof(a) 是多少?
有两个原则:
1)各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数
即当 A中的a占用了5个字节后,b需要占用四个字节,此时如果b直接放在a后,则b的起始地址是5,不是sizeof(int)的整数倍,所以
需要在a后面补充3个空字节,使得b的起始地址为8. 当放完b后,总空间为5+3+4 = 12. 接着放c,此时为 12 + 2 = 14.
2)为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,
所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
这是说A中占用最大空间的类型,就是int型了,占用了4个字节,那么规定A占用的空间必须是4的整数倍。本来计算出来占用的空间为14,
不是4的整数倍,因此需要在最后补充2个字节。最终导致A占用的空间为16个字节。
对于此题,需要注意的一点是:windows系统对long long是按照8字节进行对齐的,但是Linux系统对long long则是按照4字节对齐的。
因此:
d占用4字节
e占用2字节
f占用8字节,但是其起始地址为为0, 不是4的整数倍(对于Linux系统),或不是8的整数倍(对于Windows系统),因此对e之后进行字节补齐,
在这里不管对于linux还是Windows都是补充2个字节,因此 f 的起始地址是8,占用8个字节。
对于c,它占用了1个字节,起始地址是16,也是1的整数倍。
最后,在c之后需要对整个B结构体占用的空间进行补齐,目前占用空间是16+1 = 17个字节。
对于Linux,按4字节补齐(long long 是按4字节补齐的),因此补充了3位空字节,最后占用空间是 17 + 3 = 20字节。
对于Windows系统,是按8字节补齐的,因此就补充了7个字节,最后占用的空间是24字节。