引言
首先我们来看一个例子
看到这个结果12,可能不懂结构体内存对齐的就会感到奇怪。int是8字节,char是1字节,三个成员加起来明明是9个字节,为什么结果是12呢?那我们就带着这个问题继续看下面内容。
结构体内存对齐规则
1.第一个成员在与结构体偏移量为0(即首地址偏移量记为零,向后依次增大)的地址处。
2.其他成员对齐到对齐数(编译器默认的对齐数和该成员大小的较小值,只有VS编译器存在默认为8的对齐数)的整数倍的地址处。
3.结构体大小为所有成员中最大对齐数的整数倍。
4.在结构体中嵌套结构体时,嵌套的结构体对齐到自身最大对齐数的整数倍。
结构体对齐原因
以32位机器为例,在32位机器上,一次性会访问四个字节。由此便会出现如果所占字节为偶数时,但偏移量为奇函数时,出现一次性访问不全的原因,需要多次访问。
例题详解
嵌套结构体
库函数offsetof计算偏移量
该库函数的头文件为<stddef.h>
下面用offsetof验证上面两个代码的偏移量
可以看到用offsetof计算出来的偏移量和我们在上面图片分析的一致。