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

2021-02-17    分类: 网站建设

在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等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

本文标题:有经验的C语言程序常说的“内存对齐”,原因究竟是什么?
分享地址:/news38/101488.html

成都网站建设公司_创新互联,为您提供网站导航移动网站建设关键词优化建站公司ChatGPTApp设计

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

网站建设网站维护公司