要求结构体的大小,那么我们就要了解内存对齐的机制是怎么样的?
一. 内存对齐规则
- 比如计算如下结构体大小
struct S1
{
char c1;
int i;
char c2;
};
printf("%d\n", sizeof(struct S1));
如何计算?
首先得掌握结构体的对齐规则:
2. 第一个成员在与结构体变量偏移量为0的地址处。
什么意思看图
就是第一个成员c1从相对于0偏移量为0,即0这个位置开始存一个字节大小。
3. 那成员i怎么存呢?
那就要看当前系统如果是64位操作系统,默认对齐数为8,32位操作系统默认对齐数为32,那知道这个有什么用?
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
就如上面例子的成员i是int类型字节大小为4,与默认对齐数8比较,4为较小值,所以成员i的对齐数就是4所以成员i要从
对齐数4的倍数开始存,因为上面存了c1之后1不是4的倍数所以要浪费3个字节空间,从4开始往后存4个字节
看图:
成员c2也一样和默认对齐数8比较1是较小的那个,所以成员c2对齐数为一,所以c2要从对齐数1的倍数开始存,
因为任何数都是1的倍数所以直接从8往后存
看图
那这个结构体大小就是9了吗?错,不是这样的
- 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
这个结构体成员里面,成员i的对齐数是最大的为4,
所以答案要是4的整数倍
答案看图:
所以大小为12个字节。
**小编制作不易,承蒙大家一个小小的赞,我会创造更好的作品分享给大家,谢谢兄弟们!