

为什么要内存对齐 | yoko blog
source link: https://pengrl.com/p/20020/?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

为什么要内存对齐
CPU访问内存时,并不是逐个字节访问,而是以字长(word size)为单位访问。比如32位的CPU,字长为4字节,那么CPU访问内存的单位也是4字节。
这么设计的目的,是减少CPU访问内存的次数,加大CPU访问内存的吞吐量。比如同样读取8个字节的数据,一次读取4个字节那么只需要读取2次。
下面我们来看看,编写程序时,变量在内存中是否按内存对齐的差异。假设我们有如下结构体:
1 | struct Foo { |
示意图如下:
我们假设CPU以4字节为单位读取内存。
如果变量在内存中的布局按4字节对齐,那么读取a变量只需要读取一次内存,即word1;读取b变量也只需要读取一次内存,即word2。
而如果变量不做内存对齐,那么读取a变量也只需要读取一次内存,即word1;但是读取b变量时,由于b变量跨越了2个word,所以需要读取两次内存,分别读取word1和word2的值,然后将word1偏移取后3个字节,word2偏移取前1个字节,最后将它们做或操作,拼接得到b变量的值。
显然,内存对齐在某些情况下可以减少读取内存的次数以及一些运算,性能更高。
另外,由于内存对齐保证了读取b变量是单次操作,在多核环境下,原子性更容易保证。
但是内存对齐提升性能的同时,也需要付出相应的代价。由于变量与变量之间增加了填充,并没有存储真实有效的数据,所以占用的内存会更大。这也是一个典型的空间换时间的应用场景。
好,本篇文章就到这里,后面会再写一篇文章介绍编写c程序时,如何开关内存对齐,以及控制内存按多少字节对齐。
参考资料:
本文完,作者yoko,尊重劳动人民成果,转载请注明原文出处: https://pengrl.com/p/20020/
Recommend
-
43
[译] Go语言使用TCP keepalive 2019-06-11 | 网络编程| 2.6k本篇文章首先简单介绍了TCP keepalive的机制以及运用场景。接着介绍...
-
54
[译] Go语言调度器 by povilas 2019-06-16 | Go| 1.4k英文原文:https...
-
51
yoko bloglearn and liveGo语言channel备忘录 2019-07-16 | ...
-
43
[译] TCP的SYN队列和Accept队列 2019-10-15 |0| 1.8k关于两个队列
-
15
聊聊base64编码 2020-01-18 | 数据结构和算法| 1.2kbase64的作用二进制的数据,每个字符的取值范围都是
-
16
CPU访问内存时,并不是逐个字节访问,而是以字长(word size)为单位访问。比如32位的CPU,字长为4字节,那么CPU访问内存的单位也是4字节。 这么设计的目的,是减少CPU访问内存的次数,加大CPU访问内存的吞吐量。比如同样读取8个...
-
33
[译] Go1.14将内联defer提高性能 2020-02-08 | Go紧接前一篇《Go1.14为time.Timer定时器带来巨幅性能...
-
36
本文档目前应用于我的github项目: Go直播流媒体网络传输服务器lal ,由于我在开源协助方面的经验有限,所以本文档还在不断完善中。 包含的内容: PR规范...
-
4
Yoko Taro’s new game is about Sega running the world / The game’s official title is 404 Game Re:set. Rolls off the tongue.By
-
5
LAL v0.34.3发布,G711音频来了,Web UI也来了 Go...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK