虽然C / C ++有很多不同的malloc
/ free
复杂实现,但我正在寻找一个非常简单的(特别是)小的,适用于固定大小的缓冲区并支持realloc
。不需要螺纹安全等,并且我的物体很小并且尺寸变化不大。有没有可以推荐的实现?
修改:
我将在接收器上使用该实现来传输具有可变大小的对象(接收器未知)。分配的对象不会长寿,但可能同时使用多个对象。
由于每个人似乎都推荐使用标准的malloc,我或许应该重新提出我的问题。我需要的是在缓冲区之上的“最简单”的malloc实现,我可以根据自己的需要开始优化。也许最初的问题不清楚,因为我不是在寻找一个优化的malloc,只是为了一个简单的。我不想从一个glibc-malloc开始并扩展它,但是它的重量轻。
答案 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)