什么是未对齐指针?

18

我了解在下面这行中,我们试图写入一个无效的内存位置。但实际上这是一个未对齐的指针。能否有人解释一下什么是未对齐的指针以及以下指针为什么是未对齐的?

*(int*)0xffffffff = 0xbad;

2
在某些架构中,指针必须落在特定的边界上,例如32位字边界,因此在这种情况下,指针的低2位需要为零。 - lurker
1个回答

27

许多体系结构都有一个称为“对齐”的概念,其中硬件被设计成在字大小的倍数地址上运行。例如,在32位处理器上,对象可能对齐到32位边界(4字节),而在64位处理器上,对象可能对齐到64位边界(8字节)。对齐指针是指指向字大小倍数地址的指针,而未对齐指针指向非字大小倍数地址。

在大多数体系结构中,读取或写入未对齐指针会遭受某种惩罚。在某些处理器上,这样做会导致总线错误,通常会立即终止程序。在其他处理器上,例如x86,未对齐读写是合法的,但由于硬件结构的原因会导致性能损失。

在您的代码中,0xFFFFFFFF = 232-1 可能未对齐,因为它不是大多数常见字大小的倍数(除20以外不可被任何其他二次幂整除)。

希望这可以帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接