【发布时间】:2013-10-30 05:47:39
【问题描述】:
我目前正在尝试实现计算机编程艺术卷: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
但是,此方法假定堆从地址 0 开始。如果堆从具有 i 顺序范围内的位的地址开始,则执行上述计算不会为您提供其正确的地址伙计。
因此,简单地说,有没有一种方法可以泛化这种计算,以便它可以在任何起始堆地址处执行?假设有一个最大订单的界限。 IE* 如果最大阶数为 18,我们不会尝试执行任何大于或等于 18 阶的计算,因此您不需要找到它的伙伴。
非常感谢任何帮助或建议!
【问题讨论】:
-
为什么不创建另一个函数 AnyBuddy(X, startPoint)= Buddy(X-startPoint)+startPoint ?
-
@ElKamina 如果您有答案,请发布答案。
-
@self。我发布的几乎是答案。无论如何,特里斯坦已经以更易读的格式呈现了。
标签: c++ c algorithm memory memory-management