将地址向前对齐

Aligning an address forward

本文关键字:对齐 地址      更新时间:2023-10-16

我正在阅读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之后的第一个,我们只需要将对齐1添加到x并屏蔽该地址。">

我理解为什么需要屏蔽log2(n)的最低有效位。然而,这种方法不起作用。我已经用几个号码亲手试过了。对于检查,如果地址是17(十进制),对齐方式是6(十进制)则该方法应该返回18,但它没有。也许是因为我不明白为什么作者使用u8(这是我在互联网上读到的未签名字符)进行对齐。使用int进行对齐不是更直观吗?

在C和C++中,对齐总是2的幂。有一堆比特旋转技术只有在对齐是2的幂时才有效。

函数所做的基本上是添加alignment - 1,然后向下舍入到下一个对齐倍数。对齐的所有倍数都将其最后的log2(alignment)位设为0(因为它是2的一些幂),并且掩码仅将最后的几个位设置为0。