可能重复:
内存对齐的目的
为什么结构或任何内存分配(如 int,char)必须是字对齐的。它有什么优势?
更新:主要原因是,如果不是内存对齐,有可能数据类型(int)的一部分在一个物理页面中,而另一部分在另一个物理页面中?
我觉得这是一个更强有力的理由?
可能重复:
内存对齐的目的
为什么结构或任何内存分配(如 int,char)必须是字对齐的。它有什么优势?
更新:主要原因是,如果不是内存对齐,有可能数据类型(int)的一部分在一个物理页面中,而另一部分在另一个物理页面中?
我觉得这是一个更强有力的理由?
如果您考虑一下机器的接线方式,那一切都是有道理的。
有时,人们试图改变这一点(Rambus、FBDIMM),但我们不断将 DRAM 阵列中的每个位连接到 CPU 总线上的相同位。
在计算机的早期,在内存数据总线上移动位以纠正未对齐的访问是非常昂贵的。有些机器不允许这一切。那些确实增加了速度惩罚的人。有些,比如最初的、当时超快的和第一好的 64 位微型 DEC-Alpha,实际上确实纠正了它,但以软件陷阱为代价!
IA32 和 x64 架构始终透明地修复它,每个芯片上都有数以万计的晶体管,它们具有桶形移位器和其他专用硬件,可以轻松修补未对齐的参考。
但是,它仍然可能会中断管道,可能需要某种微陷阱;这不是“自然方式”。
确切的惩罚取决于您使用的芯片的微架构。可移植代码应该假设未对齐的访问受到惩罚。一些嵌入式 CPU 芯片 (Some Arm) 实际上不会出错,只是做错了事!我真诚地希望所有这些都停产。
许多 32 位机器上的内存访问在 32 位边界上要快得多,要访问单个字节,机器必须读取 32 位(4 字节)段,然后进入它
正如马丁所说,它更快......
...还有一些 cpu 架构和一些 cpu 指令需要它 - 否则会崩溃。
例如,一些(?)ARM cpus 会因不对齐而出错。例如,x86/x64 上的 MMX/SSE 需要 16 字节对齐。
我在某处读过相同的内容(不记得:如果我错了,请纠正我)并支持钢的评论:
字,即 2 字节或 16x 的数据通常用于那些涉及 mul / div / 有符号操作的数据操作......主要区别 b/w x85 和 x86