将地址向前对齐
Aligning an address forward
我正在阅读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。
相关文章:
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 内存地址是否由于未对齐的内存地址而损坏?
- 计算以前对齐的地址
- 对象地址是否保证是其类型对齐的倍数
- 数据对齐:限制内存地址为数据类型大小倍数的原因
- 安置新的地址对齐
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 将地址向前对齐
- 编译器如何知道物理地址的对齐方式
- x86-64上检查指针范围是否跨越N字节对齐地址的最快方法
- MOVAPS 访问未对齐的地址
- CUDA 在推力device_vector调整大小时地址未对齐
- 做 malloc 和 new 返回一个 int 对齐的地址
- 内存地址的数字表示和对齐之间的关系
- 如何将地址对齐到一个void指针
- 为什么数据断点不能在未对齐的地址上工作
- 如何确定地址是否与缓存对齐
- C++变量地址和对齐方式 |x86
- 查找下一个对齐的内存地址