关于编程语言内存对齐的疑问

2022-08-14 18:40:36 +08:00
 gps32251070

最近对于编程语言为什么要进行内存对齐有些疑问,网上看的资料基本都是说为了 CPU 的效率,减少 CPU 访问内存的次数,但是总感觉这种说法很勉强,举例: 对于 64 位系统,CPU 按 8 字节取内存,那么假设有

struct s { a int16 b int64 }

对于这个结构体,我的理解是不管对不对齐 CPU 总是要取两次的,如果这个时候多了个 c 变量

struct s { a int16 b int64 c int16 }

如果不对齐的话,那么只需要 2+8+2=12 个字节空间,CPU 只需要取两次。如果是内存对齐,那么 需要 8+8+8=24 个字节空间,CPU 反而需要读三次,这么来看不对齐不但节省 CPU 时间,还节省内存空间,所以为什么要对齐呢?。。。难道 CPU 拼接变量很消耗时间?

3320 次点击
所在节点    程序员
23 条回复
FrankHB
2022-08-15 00:46:29 +08:00
补:关于填 padding 还有避免 cache line 上 false sharing 的问题,某种意义上也是对齐问题但跟一般访存对齐不同,不过这个就更依赖实现细节,真要优化可能得分析具体的一致性协议。
cf. zhuanlan.zhihu.com/p/374586744
SunBK201
2022-08-15 02:25:31 +08:00
简单来说,因为访存地址是”对齐”的( CPU 访存时会以 offset 的形式给出地址,并不是 Byte 的形式),一次访存能整读整个 offset 行, 这样一次读一个 offset 的做法可以节省 CPU 访存地址总线,当然要以非对齐的形式读也是可以实现的,可以通过增加 CPU 的地址总线实现, 不过过多的引脚会增加 CPU 的复杂度。
cubecube
2022-08-15 14:34:48 +08:00
对齐还和 cache line 有关系呢,多查资料学习。
c struct 不会自动对齐,可以自己写几个测试程序跑跑对比下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/872792

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX