1

可能重复:
内存对齐的目的

为什么结构或任何内存分配(如 int,char)必须是字对齐的。它有什么优势?

更新:主要原因是,如果不是内存对齐,有可能数据类型(int)的一部分在一个物理页面中,而另一部分在另一个物理页面中?

我觉得这是一个更强有力的理由?

4

4 回答 4

2

如果您考虑一下机器的接线方式,那一切都是有道理的。

有时,人们试图改变这一点(Rambus、FBDIMM),但我们不断将 DRAM 阵列中的每个位连接到 CPU 总线上的相同位。

在计算机的早期,在内存数据总线上移动位以纠正未对齐的访问是非常昂贵的。有些机器不允许这一切。那些确实增加了速度惩罚的人。有些,比如最初的、当时超快的和第一好的 64 位微型 DEC-Alpha,实际上确实纠正了它,但以软件陷阱为代价!

IA32 和 x64 架构始终透明地修复它,每个芯片上都有数以万计的晶体管,它们具有桶形移位器和其他专用硬件,可以轻松修补未对齐的参考。

但是,它仍然可能会中断管道,可能需要某种微陷阱;这不是“自然方式”。

确切的惩罚取决于您使用的芯片的微架构。可移植代码应该假设未对齐的访问受到惩罚。一些嵌入式 CPU 芯片 (Some Arm) 实际上不会出错,只是做错了事!我真诚地希望所有这些都停产。

于 2011-03-01T05:17:47.420 回答
1

许多 32 位机器上的内存访问在 32 位边界上要快得多,要访问单个字节,机器必须读取 32 位(4 字节)段,然后进入它

于 2011-03-01T05:01:31.743 回答
0

正如马丁所说,它更快......

...还有一些 cpu 架构和一些 cpu 指令需要它 - 否则会崩溃。

例如,一些(?)ARM cpus 会因不对齐而出错。例如,x86/x64 上的 MMX/SSE 需要 16 字节对齐。

于 2011-03-01T05:08:37.357 回答
0

我在某处读过相同的内容(不记得:如果我错了,请纠正我)并支持钢的评论:

字,即 2 字节或 16x 的数据通常用于那些涉及 mul / div / 有符号操作的数据操作......主要区别 b/w x85 和 x86

于 2011-03-01T05:17:04.773 回答