c语言内存对齐

内存对齐是为了提高数据访问效率和系统可移植性。结构体数据对齐时,每个成员变量的起始地址需要是自身大小的整数倍,结构体大小需要是最大成员变量的整数倍。联合体数据对齐按最大成员对齐模数对齐。可以通过__attribute__((aligned(对齐字节数)))或#pragma pack修改内存对齐方式。
摘要由CSDN通过智能技术生成

内存对齐

什么是内存对齐?

内存对齐:在计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问任何类型的变量。但实际上在访问特定类型的变量的时候需要从特定的地址开始,这就需要各种类型的数据按照一定的规则在空间上排列,而不是顺序的一个接一个的存放,这就是内存对齐,也叫字节对齐。

为什么要内存对齐?

内存对齐的作用:

  • 可移植性:因为不同平台对数据的在内存中的访问规则不同,不是所有的硬件都可以访问任意地址上的数据,某些硬件平台只能在特定的地址开始访问数据。所以需要内存对齐。
  • 性能原因:一般使用内存对齐可以提高CPU访问内存的效率。如32位的intel处理器通过总线访问内存数据,每个总线周期从偶地址开始访问32位的内存数据,内存数据以字节为单位存放。如果32位的数据没有存放在4字节整除的内存地址处,那么处理器需要两个总线周期对数据进行访问,显然效率下降很多;另外合理的利用字节对齐可以有效的节省存储空间。

默认内存对齐影响因素:与平台架构(位数)和编译器的默认设置有关。

结构体数据对齐

C++标准规定,int占一个机器字长。在32位系统中int占32位,也就是4个字节,而在老式的16位系统中,int占16位,即2个字节。而C++标准中只限制规定short int不能超过int的长度,具体长度的可以由C++编译器的实现厂商自行决定。目前流行的32位C++编译器中,通常int占4字节,short int占2字节。其中short int可以简写为short。

结构体如何处理数据对齐?
  • 每种类型的成员变量的起始地址需要是自身大小的整数倍,如果不是,前面的变量就需要填充;
  • 结构体自身的大小还需要是最大成员size的整数倍;

G C C GCC GCC编译器默认的最大对齐模数为4,超过四字节时仍按照4字节对齐。 a r m − l i n u x − g c c arm-linux-gcc armlinuxgcc默认最大对齐字节数为8字节)

比如有如下一个结构体:

  struct stu{
   
   char sex;
   int length;
   char name[10];
  };
  struct stu my_stu;

sex后面填充3个字节使得length字节对齐,name后面填充2个字节,使得结构体整体对齐。(最大成员size是4字节,所以结构体整体按照4字节的整数倍对齐),于是我们sizeof(my_stu)会得到长度为20,而不是15.

struct student
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发生了什么Bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值