内存对齐的主要作用:
1、 平台原因(移植原因):不是全部的硬件平台都能访问随意地址上的随意类型数据的;某些硬件平台仅仅能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、 性能原因:经过内存对齐后,CPU的内存訪问速度大大提升。
详细原因稍后解释。
图一:
这是普通程序猿心目中的内存印象。由一个个的字节组成。而CPU并非这么看待的。
图二:
CPU把内存当成是一块一块的,块的大小能够是 2,4,8,16 字节大小。因此CPU在读取内存时是一块一块进行读取的。块大小称为 memory access granularity(粒度) 本人把它翻译为“内存读取粒度” 。
如果CPU要读取一个int型4字节大小的数据到寄存器中,分两种情况讨论:
1、数据从0字节开始
2、数据从1字节开始
在此如果内存读取粒度为4。
图三:
当该数据是从0字节开始时,通常CPU仅仅需读取内存一次就可以把这4字节的数据全然读取到寄存器中。
当该数据是从1字节开始时,问题变的有些复杂。此时该int型数据不是位于内存读取边界上。这就是一类内存未对齐的数据。
图四:
此时CPU先访问一次内存。读取0—3字节的数据进寄存器。并再次读取4—5字节的数据进寄存器,接着把0字节和6,7,8字节的数据剔除。最后合并1,2,3。4字节的数据进寄存器。对一个内存未对齐的数据进行了这么多额外的操作。大大减少了CPU性能。
这还属于乐观情况了。上文提到内存对齐的作用之中的一个为平台的移植原因,由于以上操作仅仅有有部分CPU肯干,其它一部分CPU遇到未对齐边界就直接罢工了。
标签:
编程基础
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· Java轻量级代码工程
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战