Skip to content

内存空间对齐实现 ​

一般来说, 为了加速, 类型的对象要求其起始地址满足”对齐“ —— 比如在常见的 x86-64 下, int 对齐要求是 4 —— 即我们希望 int 类型存储的首地址 address % 4 == 0

我们其实可以发现, 这个要求判断的是 address == 4k, 那么观察 4k 的二进制规律,可以发现,只要是4️⃣的倍数,其最后两位一定是 0, 也就是我们把问题等价转化成了查看其二进制下的最后两位规律.

同理, 只要对齐的是二的整数次幂, 都有类似的规律.

我们以对齐 8 作为例子, 如果要让一个数进行向下取整到对齐 8, 则只需要直接使得其末三位为 0 即可.

aligned_value = value & ...1111111000

大体上可以这么思考, 所以我们需要构造这个 “000” —— 首先观察 8 的二进制, 是 (1000)2, 那么假设我们对其 -1 然后再取反, 则可以构造出 000 这样的存在,同时非常好的, 其前面的“填充”位全都是 1. 所以在 & 操作的时候, 即说明我们保留前面的所有位数, 仅仅抹去最后三位. 所以假设我们要对齐的目标是 alignment, 则可以有如下表示 ——

alignd_value = value & ~(alighment - 1)

但是这是向下取整, 而假设我们现在的分配规则是从低地址往高地址增长, 则需要先加上一份 alignment - 1 然后再进行取整.

综上所述, 我们假定当前的地址是 current, 然后想要把 current 地址向上取到对齐位的话,可以有如下表示

aligned_value = (current + alignment - 1) & ~(alignment - 1)

Released under the MIT License.