【发布时间】:2020-11-09 04:52:06
【问题描述】:
假设我想在堆栈上保留8 bytes,并且我还想确保当前stack pointer 是8 字节对齐的。我已经看到一些代码可以确保当前 sp 使用以下逻辑对齐 8 字节:
sp = sp & -8;
他们AND它与他们将在堆栈上保留的数量(当然是负数)。
这个逻辑是如何工作的?
【问题讨论】:
标签: stack alignment memory-alignment sp stack-pointer
假设我想在堆栈上保留8 bytes,并且我还想确保当前stack pointer 是8 字节对齐的。我已经看到一些代码可以确保当前 sp 使用以下逻辑对齐 8 字节:
sp = sp & -8;
他们AND它与他们将在堆栈上保留的数量(当然是负数)。
这个逻辑是如何工作的?
【问题讨论】:
标签: stack alignment memory-alignment sp stack-pointer
之所以有效,是因为负数用二进制补码表示,所以-8 等价于~7,其中 3 个最低有效位为 0,其余为 1。将其与一个值相加会清除 3 个最低有效位,这显然会导致它是 8 字节对齐的。顺便说一下,这个技巧只适用于将事物与 2 的幂对齐。例如,如果您有一些奇怪的理由将事物与 12 字节边界对齐,sp = sp & -12 将无法按预期工作。
【讨论】: