为什么结构必须是字对齐的?

时间:2011-03-01 04:58:29

标签: c data-structures word alignment memory-alignment

  

可能重复:
  Purpose of memory alignment

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

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

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

4 个答案:

答案 0 :(得分:2)

如果你想一下机器是如何接线的,那一切都很有意义。

偶尔,人们试图改变这种情况(Rambus,FBDIMM),但我们不断回头将DRAM阵列中的每个位连接到CPU总线上的相同位。

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

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

但是,它仍然可能会打断管道,可能会采取某种微型陷阱;它不是“自然的方式”。

确切的惩罚特定于您正在使用的芯片的微体系结构。可移植代码应该假设未对齐的访问受到惩罚。一些嵌入式CPU芯片(Some Arm)实际上并没有出错,只是做错了!我真诚地希望所有这些都不在生产中。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

马丁说它更快......

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

例如,某些(?)ARM cpus会在非对齐时出错。 例如,x86 / x64上的MMX / SSE需要16byte对齐。

答案 3 :(得分:0)

我在某处读过同样的内容(无法回忆:如果我错了,请纠正我)并支持钢铁的评论:

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