K&R malloc的优点

  • 简单
  • 代码大小很小(malloc仍然内置等)
  • 除非有大量碎片空间,否则malloc是O(1) 复杂度
  • 适用于小程序,整个程序中只使用几十次malloc

K&R malloc的缺点

  • 当小型malloc频繁出现时,会出现大量碎片空间
  • free是O(n)复杂度
  • 在调用brk时,需要遍历freelist一次(如果有数万个列表,缓存、刷新、代码状态将是很恐怖的)
  • 当碎片空间增加,内存效率也急速恶化

时代变了

  • 现在的编程语言

    • GUI
    • 脚本语言或者Java
    • C++程序语言
    • 等等

    只重复一个小型的malloc

最大的问题是什么

  • 在这里,首先假定碎片是最大的问题
  • 如果能够解决碎片问题
    • 内存使用效率UP
    • 内存使用量较少,缓存效率UP
    • 看起来很酷

现在需要best fit 分配器,根据just Idea来实现它

停止使用地址顺序,尝试使用size顺序进行排序

free的时候,不可能和相邻节点合并

就会产生额外的碎片空间

毕竟我们需要将新增成员增加到malloc header里

地址空间的prev,next不是用指针保持的,而是用size

发生了什么变化

  • 哪里变好了
    • free从典型的O(n) 变成了O(1)
    • 碎片造成的空间浪费减少了
  • 哪里变得更糟糕
    • malloc从O(1)变成了O(n)
    • header size增加,空间效率降低

这可不行,接下来进入正题