【发布时间】:2018-12-24 14:25:19
【问题描述】:
我正在阅读 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)));
}
作者是这样解释的。 “为了 n 字节对齐内存地址 x,我们需要从 x 中屏蔽 log2(n) 最低有效位。简单地屏蔽位将返回 x 之前的第一个 n 字节对齐地址,因此为了找到之后的第一个x 我们只需要将alignment-1 添加到x 并屏蔽该地址。”
我了解您为什么需要屏蔽 log2(n) 最低有效位。但是,该方法不起作用。我已经用几个数字手动尝试过。例如,如果地址为 17(十进制)且对齐方式为 6(十进制),则该方法应返回 18,但事实并非如此。也许是因为我不明白为什么作者使用 u8(这是我在互联网上阅读的无符号字符)进行对齐。使用int进行对齐不是更直观吗?
【问题讨论】:
-
此外,
&的左操作数是u8*(u8*+u8的结果),其右操作数是u8。如果我是 C++ 编译器,我会拒绝该代码。 -
将数字与 2 的幂对齐的公式比将数字与任意数字对齐的通用公式要高效得多。鉴于内存对齐始终是 2 的幂,那么使用优化版本是有意义的。任意对齐基本上需要加法、乘法和除法,而除法通常是一个相对较慢的操作。
标签: c++