【发布时间】:2013-10-30 16:46:50
【问题描述】:
这是对我实施好友分配方案的第二次询问,第一个问题是here,这也解释了好友分配实际上是什么。在标准实现中,从 2^i 的大块开始,其中 i 是一个整数,它适用于静态堆大小(在这种情况下,整个堆是最大的块)。
我的问题取决于处理动态调整堆大小的实现,其中堆大小从 0 开始。目前,当最高顺序 i 时,无法在空闲列表中找到块(a空闲块列表),我调用扩展堆大小以占用这个最高阶块。
问题是我不确定这个导数是否会破坏伙伴系统中的不变量,即计算给定地址的伙伴块地址。这可以简单地通过翻转第 i 阶位来计算。这个计算的解释在我之前的问题中。当我实施这个方案时,有时我会返回错误的好友地址。
【问题讨论】:
-
您为了增加堆大小而进行了哪个调用?
-
@fvdalcin 这是一个自定义调用,它所做的只是将指向堆后部的指针移动到一个大小参数的后面,并返回一个指向这个新分配块中第一个地址的 void 指针。
-
AFAIK 伙伴方案假定堆是连续的。通常,扩展堆要么破坏该不变量,要么必须移动堆的现有部分并更新所有指针,这在大多数环境中是不可能的(那些您可以识别 all 指针并更新它们的环境引用新的堆区域)。
-
@delnan 即使您每次仅将堆扩展为最大订单大小的固定数量?这不会创建两个单独的“伙伴树”吗?
标签: c++ c algorithm memory memory-management