我正在阅读有关gameDev https://www.gamedev.net/articles/programming/general-and-gameplay-programming/c-custom-memory-allocation-r3010/的自定义内存管理器文章 并且他们有一种向前对齐地址的方法。但是,我只是不明白
inline void* alignForward(void* address, u8 alignment)
{
return (void*)((reinterpret_cast<u8*>(address) + static_cast<u8>(alignment-1)) & static_cast<u8>(~(alignment-1)));
}
这是作者的解释方式。 “要对内存地址x进行n字节对齐,我们需要屏蔽掉x中的log2(n)最低有效位。简单地屏蔽掉位将返回x之前的第一个n字节对齐地址,因此为了找到之后的第一个字节x,我们只需要在x上添加alignment-1并屏蔽该地址即可。”
我了解您为什么需要屏蔽log2(n)最低有效位。但是,该方法不起作用。我已经用几个数字手工尝试过。例如,如果地址是17(十进制),对齐方式是6(十进制),则该方法应返回18,但不是。也许是因为我不明白为什么作者使用u8(这是我在互联网上阅读的未签名字符)进行对齐。使用int进行对齐会更直观吗?
答案 0 :(得分:2)
在C和C ++中,对齐始终是2的幂。一堆旋转技巧只有在对齐方式为2的幂时才有效。
该函数的作用基本上是添加alignment - 1
,然后向下舍入到下一个对齐倍数。对齐方式的所有倍数的最后log2(alignment)
位都将为0(因为它是2的幂),而掩码仅将最后几位设置为0。