简单的c malloc

时间:2010-09-20 14:52:11

标签: c malloc realloc

虽然C / C ++有很多不同的malloc / free复杂实现,但我正在寻找一个非常简单的(特别是)小的,适用于固定大小的缓冲区并支持realloc。不需要螺纹安全等,并且我的物体很小并且尺寸变化不大。有没有可以推荐的实现?

修改

我将在接收器上使用该实现来传输具有可变大小的对象(接收器未知)。分配的对象不会长寿,但可能同时使用多个对象。

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

7 个答案:

答案 0 :(得分:26)

Kerninghan& Ritchie似乎在他们的C书中提供了一个小型的malloc / free - 这正是我所寻找的(reimplementation found here)。我只会添加一个简单的realloc。

我仍然对其他实现的建议感到高兴,这些实现简单而简洁(例如,使用双向链表)。

答案 1 :(得分:17)

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

还应注意,没有合法的方法可以重新定义malloc / free

答案 2 :(得分:4)

您的编译器附带的malloc / free / realloc几乎肯定会比您要插入的某些功能更好。

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

答案 3 :(得分:3)

听起来你正在寻找一个内存池。 Apache Runtime library有一个非常好的,它也是跨平台的。

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

答案 4 :(得分:2)

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

char *malloc_ptr;
void *malloc(int size)
{
  void *ret;
  ret = (void*)malloc_ptr;
  malloc_ptr += size;
  return ret;
}

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

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:1)

回应首先测量的建议,只有在性能糟糕的情况下专门化 - 应该很容易抽象出malloc / free / reallocs,以便替换是直截了当的。

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