C++-为什么要进行内存对齐内存对齐?

小组聊天灌水 小组聊天灌水 主题:993 回复:2175

C++-为什么要进行内存对齐内存对齐?

清晨说ぺ晚安 发布于 2017-09-16 字数 156 浏览 1213 回复 3

我知道什么是内存对齐也知道内存对齐的结果,但我想知道为什么C/C++编译器为什么要进行内存对齐?有人说是为了更好的访问效率?但是为什么对齐后访问效率更快?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

归属感 2017-10-19 3 楼

1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

晚风撩人 2017-10-18 2 楼

进行内存对齐的作用主要是有两个:
(1)平台移植。不是所有的硬件平台都能够访问任意地址上的数据,
(2)性能:内存对齐后访问速度提升了。
下面解释一下为什么内存对齐会提升效率。

CPU把内存当成是一块一块的,块的大小可以是2、4、8、16字节等大小。CPU在读取内存的时候是一块一块读取的。块大小即memory access granularity:内存读取粒度。

假设CPU要读取一个int型4字节大小的数据,看下列2种情况:
(1)数据从0字节开始;
(2)数据从1字节开始;
假设内存读取粒度是4.

情况(1)的时候,CPU只需一次便可把4字节读取出来。
但是情况(2)的时候,要复杂一些。这个时候CPU先访问一次内存,读取0-3字节进寄存器,再读取4-7字节进寄存器,然后把0、6、7、8字节的数据删除掉,最后合并1-4字节的数据。可以看出,如果内存没有对齐,所进行的操作要复杂得多。

尤其是,上面的这些操作也只是一部分CPU可以实现,即平台移植~~

参考资料:
CPU and data alignment

清晨说ぺ晚安 2017-10-07 1 楼

主要内存对齐主要是为了速度

如果数据不是对齐的 cpu执行一些运算 要花费额外的时钟周期来处理对齐问题 再做运算

还有一些就是平台移植

还有就是网络编程中的数据对其 也是为了节省不必要的空间浪费 提高传输效率