字节对齐的原因

本文详细解释了字节对齐的概念,包括其原因、影响、对比以及在编程中的实现方式。重点阐述了字节对齐如何通过减少访问周期和优化数据读写来提高性能,尤其是在不同架构的计算机中。示例说明了字节对齐设置的关键技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是字节对齐?

变量存取地址为在它所属类型的倍数的地址单元上,例如double要放在8的倍数的地址上,int要放在4的倍数的地址上…

字节对齐的原因

这样做的原因是,内存的存取并不是按照1个字节,而是按照计算机位数对应的字节来访问,例如:在32位机器上,每次访问4个字节,64位机器上,每次访问8字节。如果按照字节对齐的方式,访问数据速度更快。如果不按照字节对齐,则访问数据的周期数会增加。

字节对齐与字节不对齐的对比

这里以 32 位机器为例。

1. 访问周期

  • 按照字节对齐,访问 double 数据,只需要 2 个指令周期,int 型变量只需要 1 个指令周期。
  • 如果字节不对齐,访问 double 时则可能需要 3 个指令周期,而访问 short 型变量有可能需要 2 个指令周期。
    在这里插入图片描述

2.存储空间

显然字节对齐会占用更大的存储空间,字节不对齐会节约空间。

3. 总结

字节对齐虽然占用更大的空间,但是它带来的是访问速度的提高,目前存储空间已经足够我们使用,我们更在意的是数据的访问速度。

字节对齐的设定

  • #pragma pack(n) : 当n比自然边界大时,按照自然边界对齐。当n比自然边界小的时候,按照n对齐。
  • attribute((aligned(m)))
  • attribute((packed))
    在这里插入图片描述

示例

uint64_t 自然边界为8字节,但是#pragma park 中的 n = 4< 8,所以按照n,即4字节对齐,所以f5放在地址12而非地址16处。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

汤梦飞123

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

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

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

打赏作者

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

抵扣说明:

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

余额充值