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