图解内存对齐-结构体

此文主要介绍的是关于结构体内存对齐相关知识,如果对此存在问题或者有兴趣的读者可以看看。

1 结构体介绍

结构体的声明

struct  stu{
	char name[20];
	int age;
	char sex[5];
};
上述代码,stu是结构体tag,花括号内部是成员变量,至少存在一个成员变量。花括号后的分号;不能省略。

1.1 代码分析1

struct  S2
{
	char c1;
	int i;
	char c2;
};
printf("%d\n", sizeof(struct S2));

输出结果:12
分析:c1占一个字节,但是i从第5个开始存储,c2从第9个开始存储。

1.2 图解1

存储结构图

1.3 代码分析2

struct  S1
{
	char c1;
	char c2;
	int i;
};
printf("%d\n", sizeof(struct S1));

输出结果:8
分析:c1,c2挨着存放,但i从第5个开始存储。

1.4 图解2

存储结构图

2 提升内容

  • 结构体嵌套时,如何看内存对齐,计算内存大小。
  • 修改默认对齐数#pragma pack(1)、#pragma pack();分别代表的是设置对齐数为1,取消对齐数,还原为默认。
  • 位段:一种压缩存储方案,不考虑效率,只考虑空间使用率。其用法和内存对齐有点相对的意思。

3 总结

1 结构体第一个元素不需要对齐,直接存放,即偏移量为0的地址处。
2 其他成员变量要对齐到对齐数的整数倍的地址处。
3 结构体总大小为最大对齐数的整数倍,每个结构体元素都要参与运算
4 嵌套结构体,结构体的整体大小就是所有最大对齐数的整数倍。

内存对齐:以牺牲空间提高效率

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值