之前面试百度,面试官花了很长时间在内存对齐上面,答得不好。对高频使用的数据结构,好的对齐方式,肯定有好处,但通常情况下这种内存层面的速度差异对性能的影响真的有必要考虑吗?
1
xuanbg 2021-03-23 14:51:29 +08:00
有必要!非常有必要。浪费点内存不算啥,减少错误提高性能很重要。
|
2
delpo 2021-03-23 14:53:34 +08:00
基本的了解还是有必要的,如果只是换一下变量定义顺序就能减少内存占用,何乐而不为呢
|
3
lewis89 2021-03-23 14:54:53 +08:00
Java 根本不需要操心这种问题..
你应该是写 C/C++的,一般这种实际开发中也不需要考虑,大部分都是内存管理做掉了 像 C++可能重写了 内存管理,C 的话可能不用自带的 malloc 跟 free |
4
LGA1150 2021-03-23 14:57:01 +08:00
MIPS 下内存不对齐的访问会直接 CPU 异常
|
5
Akiyu 2021-03-23 14:59:46 +08:00
使用标准库以及使用接口分配的内存, 底层的对补齐都有处理.
比较需要关心的是用户自定义数据结构. 数据按照从小到大排列就可以最小化. |
6
gmywq0392 2021-03-23 15:05:51 +08:00
如果涉及到和 native 的接口交互可能需要,和使用语言应该没多大关系。。。
|
7
dndx 2021-03-23 15:10:07 +08:00
重要,尤其是实现数据结构,对齐访问可以比不对齐快很多,而且 CPU 缓存命中率也会好很多。即使是在像 x86 这种可以允许不对齐访问的架构上。
有的架构不对齐是根本跑不起来的。所以从可移植性的角度来说也需要对齐。 |
8
3dwelcome 2021-03-23 15:13:06 +08:00
需要关注,以前不懂,我写了一大堆不对齐的 PC x86 源代码,后来移植到安卓 ARM 上,才发现 GCC/CLANG 都需要强制内存对齐的!要不然直接代码奔溃。
修了一大堆潜在 BUG,重写了一大片代码,这教训绝对深刻。 |
9
hxndg 2021-03-23 15:13:41 +08:00
从实际角度出发,一般的数据结构编译器也会做优化
如果是类似锁这种高频结构的话是必须得考虑对齐和伪共享问题的。 不过,一般平时不会经常用到。 |
10
hitmanx 2021-03-23 15:15:31 +08:00
上层一般不用关心,底下写框架的或者写引擎的,一般会更重视这个。以前入门 cuda 时候印象挺深,一半的篇幅 API 就讲完了,剩下的一半篇幅好几百页都会侧重于性能分析以及性能提高,比如 cache 的 bank conflict, hit rate 等等,这些都需要一些专门的工具去分析的。
|