c/c++语言开发共享伙伴分配算法 – 开始堆地址

我目前正在尝试实现计算机程序设计Vol: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进行xor'ing)。 如果给出左块地址,则返回右块。 如果给出正确的块,则返回左侧块。

但是,此方法假定堆以地址0开头。如果堆开始的地址位于i顺序范围内的位有一个,则执行上述计算将不会为您提供其伙伴的正确地址。

因此,简单地说,有没有办法推广这个计算,以便它可以在任何起始堆地址执行? 假设有一个最大订单的约束。 IE *如果最大订单是18,我们不会尝试执行任何大于或等于18的计算,因此您不需要找到它的伙伴。

对此非常感谢的任何帮助或建议!

    哇,铁杆。 感谢阅读Knuth!

    无论如何,我可能会忽略这一点,但在某些时候你要求(我推测)来自操作系统的连续内存块以应用伙伴系统。 所以你不能只保留起始地址(无论如何你需要它以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; } 

      以上就是c/c++开发分享伙伴分配算法 – 开始堆地址相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560292.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐