14

malloc虽然 C/C++ 的/有许多不同的复杂实现free,但我正在寻找一种非常简单且(尤其是)小的,适用于固定大小的缓冲区并支持realloc. 不需要线程安全等,我的对象很小,大小变化不大。有什么可以推荐的实现吗?

编辑

我将使用该实现作为接收器的通信缓冲区来传输可变大小的对象(接收器未知)。分配的对象不会存活很长时间,但可能同时使用多个对象。

由于每个人似乎都推荐标准 malloc,我也许应该重新提出我的问题。我需要的是在缓冲区之上“最简单”的 malloc 实现,我可以开始针对自己的需要进行优化。也许最初的问题不清楚,因为我不是在寻找优化的 malloc,而只是寻找一个简单的 malloc。我不想从 glibc-malloc 开始并扩展它,而是使用轻量级的。

4

7 回答 7

27

Kerninghan & Ritchie 似乎在他们的 C 书中提供了一个小的 malloc / free - 这正是我正在寻找的(重新实现在这里找到)。我只会添加一个简单的 realloc。

对于其他与此一样简单和简洁的实现的建议(例如,使用双向链表),我仍然会很高兴。

于 2010-09-20T16:02:46.220 回答
17

我推荐与编译器捆绑在一起的标准库。

还应该注意没有合法的方法来重新定义 malloc/free

于 2010-09-20T14:54:29.697 回答
4

编译器附带的malloc//几乎肯定比您要插入的某些函数更好。freerealloc

对于固定大小的对象,可以改进一些东西,但这通常不涉及尝试替换,malloc而是用内存池来补充它。通常,您将使用malloc获取大量内存,您可以将其划分为适当大小的离散块,并管理这些块。

于 2010-09-20T15:08:41.237 回答
3

在我看来,您正在寻找一个内存池。Apache Runtime 库有一个相当不错的库,它也是跨平台的。

它可能不是完全轻量级的,但源是开放的,你可以修改它。

于 2010-09-20T15:34:05.793 回答
3

CCAN中有一个相对简单的内存池实现:

http://ccodearchive.net/info/antithread/alloc.html

这看起来符合您的要求。当然,alloc.c有 1230 行,但其中很大一部分是测试代码和列表操作。它比您实现的代码复杂一点,但体面的内存分配很复杂。

于 2010-09-20T17:35:09.057 回答
2

我通常不会用分配函数重新发明轮子,除非malloc/etc 不支持我的内存使用模式。或者内存可以划分为一个或多个预先分配的区域,每个区域包含一个或两个 LIFO 堆(释放任何对象会释放同一堆中在其之后分配的所有对象)。在后一种情况的常见版本中,只有任何东西被释放,所有东西都被释放;在这种情况下, malloc() 可以有用地重写为:

字符 *malloc_ptr;
无效 *malloc(int 大小)
{
  无效 *ret;
  ret = (void*)malloc_ptr;
  malloc_ptr += 大小;
  返回 ret;
}

每个分配对象的开销为零字节。将自定义内存管理器用于 malloc() 不足的场景的示例是可变长度测试记录产生可变长度结果记录(可能更长或更短)的应用程序;应用程序需要支持获取结果并在批处理中添加更多测试。测试存储在从缓冲区底部开始的递增地址,而结果存储在从顶部开始的递减地址。作为一项后台任务,当前测试之后的测试将被复制到缓冲区的开头(因为只有一个指针用于读取测试以进行处理,所以复制逻辑将根据需要更新该指针)。如果应用程序使用了 malloc/free,它'

于 2010-09-20T16:52:19.917 回答
1

呼应建议首先测量并且仅在性能糟糕的情况下才进行专门化 - 应该很容易抽象您的 malloc/free/reallocs,这样替换就很简单了。

鉴于专用平台,我无法评论运行时的有效性。如果您确实调查了自己的对象池(请参阅其他答案)或小对象分配(如Loki ) ,或者值得一看。第二个链接也对这个问题有一些有趣的评论。

于 2010-09-20T15:21:28.823 回答