【发布时间】:2013-12-09 14:09:47
【问题描述】:
我了解到,在以下行中,我们正在尝试写入无效的内存位置。但这实际上也是一个未对齐的指针。谁能解释一下什么是未对齐的指针,以及下面的未对齐指针是怎样的?
*(int*)0xffffffff = 0xbad;
【问题讨论】:
-
某些体系结构中的指针必须落在某些边界上,例如,32位字边界,因此在这种情况下,指针的低2位需要为零.
我了解到,在以下行中,我们正在尝试写入无效的内存位置。但这实际上也是一个未对齐的指针。谁能解释一下什么是未对齐的指针,以及下面的未对齐指针是怎样的?
*(int*)0xffffffff = 0xbad;
【问题讨论】:
许多体系结构都有一个称为对齐的概念,其中硬件被设计为对字长倍数的地址进行操作。例如,在 32 位处理器上,对象可能与 32 位边界(4 个字节)对齐,而在 64 位处理器上,对象可能与 64 位边界(8 个字节)对齐。对齐指针是指向一个字长倍数的地址的指针,而未对齐指针是指不指向一个字长倍数地址的指针。
在大多数架构上,读取或写入未对齐的指针会受到某种惩罚。在某些处理器上,这样做会导致总线错误,这通常会立即终止程序。在其他平台(例如 x86)上,未对齐的读取和写入是合法的,但会因硬件的结构而遭受性能损失。
在您的代码中,0xFFFFFFFF = 232 - 1 可能未对齐,因为它不是最常见字长的倍数(它不能被 2 以外的任何 2 的幂整除0)。
希望这会有所帮助!
【讨论】: