好友分配算法 - 起始堆地址
Buddy Allocation Algorithm - Beginning Heap Address
我目前正在尝试实现《计算机编程艺术》第1卷中描述的Buddy Allocator,它利用了给定数据块及其相应伙伴地址中的重要不变量。计算如下...
BUDDY(X):
X + 2^i if x mod 2^i+1 = 0
X - 2^i if x mod 2^i-1 = 0
Where X is the address of the block; i is the current order
使好友系统表现如此出色的原因是,这种查找好友地址的计算可以简单地通过翻转第 i 阶位来执行(通过用 1 <<i 进行异或运算)。如果给定左块地址,这将返回右块。如果给定右块,这将返回左块。
但是,此方法假定堆从地址 0 开始。如果堆以具有 i 顺序范围内的位的地址开头,则执行上述计算将不会为您提供其好友的正确地址。
因此,简单地说,有没有办法概括这个计算,以便它可以在任何起始堆地址上执行?假设存在最大订单的绑定。IE* 如果最大阶数为 18,我们不会尝试执行任何大于或等于 18 阶的计算,因此您无需找到它的伙伴。
对此的任何帮助或建议都非常感谢!
哇,硬核。为阅读高德纳点赞!
无论如何,我可能错过了重点,但在某些时候,您正在请求(我假设)来自操作系统的连续内存块以应用好友系统。那么,您不能只保留起始地址(无论如何您都需要稍后free()
),并使用该偏移量使您使用的地址看起来从零开始吗?即像这样:
uint8_t* start_addr = malloc(SIZE_IN_BYTES);
uint8_t* buddy(uint8_t* real_x) {
uint8_t *x = real_x - start_addr;
// do buddy bit-flipping on "x"
return x + start_addr;
}
相关文章:
- 将数组的地址分配给变量并删除
- 将地址分配给本地指针后,公共对象的变量将消失
- LLVM 传递以在特定地址分配内存
- 如何按顺序或在指定的地址分配内存?
- C 内存地址分配
- 有没有其他方法可以将地址分配给指针变量
- 我可以将文件描述符的地址分配给变量
- 将地址分配给结构内的指针
- 如何将数组的地址分配给指针
- 尝试将派生类对象地址分配给基类指针的向量
- 将派生的对象地址分配给基础指针和调用击路仪的机制
- 在 c++ 中使用指针访问 2d 数组,如何将地址分配给指针
- 查询与将地址分配给共享_ptr有关
- 将非常量的地址分配给常量指针
- 类的地址分配
- 将 int 自己的地址分配给其值
- 如果指定了参数,如何将地址分配给函数指针
- std::bad_alloc从引用的地址分配指针
- 在该地址c++分配之前和之后相等指针之间的差异
- 在窗口中的特定地址分配数据