有经验的C语言程序常说的“内存对齐”,原因究竟是什么?

发布时间:2025-11-14 点击:4
在c语言程序开发中,有时有经验的程序员会提起“内存对齐”一词,事实上,这也是c语言中结构体的 size 不等于它所有成员 size 之和的原因(c语言中的结构体的size,并不等于它所有成员size之和,为什么?),那么,c语言程序为什么要“内存对齐”呢?
c语言程序为什么要“内存对齐”呢?
为什么要“内存对齐”?
因此,对于c语言程序中的一些数据而言,进行“内存对齐”至少有以下几点好处:
cpu 总是以字大小访问数据
假设在c语言程序开发中,我们在内存里定义了下面这样的数据结构:
struct mystruct { char c; // one byte int i; // four bytes short s; // two bytes}在 32 位处理器上,上述数据结构可能会被按照下图这样排列(即所谓的“内存对齐”):
上述数据结构可能会被按照这样排列
此时,处理器访问结构体 mystruct 的任意一个成员都只需一次访问。如果没有内存对齐,mystruct 的各个成员在内存中紧密排列,如下图:
在内存中紧密排列
此时,如果处理器需要从 0x05 处读取 16 位数据,处理器将不得不从 0x04 处读取一个字(这里等于 4 字节),然后左移一个字节,将结果放入 16 位寄存器中。
如果处理器需要从 0x01 处读取 32 位数据,效率就降低至少 2 倍了:处理器不得不从 0x00 处读取一个字,并且左移一个字节,然后从 0x04 处再读取一个字,并且右移 3 个字节,最终使用 or 位运算将两次读取结果拼接,才能达成目的。
访问范围提高
空间,如果体系架构可以确定 2 个 lsb 总是 0(例如 32 位机器),那么它可以访问 4 倍多的内存(2 个位能够表示 4 个不同状态)。从一个地址中去掉 2 个 lsb,将得到 4 字节的内存对齐,或者说“跨距”,因为地址每增加一,它就有效的增加 bit 2,而不是 bit 0。(鉴于低 2 位总是 00)
这甚至会影响系统的物理设计:如果地址总线的需要少 2 位,cpu 上的管脚就可以少 2 个。点个赞再走吧
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍c语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。


拯救我们16G内存手机的利器来了,看样子有望了
百度快照推广网站索引下降的原因你知道吗?
网站整站营销中关键词排名如何靠前?
可能被忽视的3个潜在的多云挑战
企业网站如何选择响应式和自适配框架?
如何建设一个大气的金融公司官网
响应式网站有什么特征
网络优化要怎么做才能做好,解决网站客户流量的问题?