C语言中的内存池实现

9

我正在寻找一种优秀的C语言内存池实现。

它应该包括以下几个方面:

  1. 抗碎片化
  2. 非常快速 :)
  3. 能够将来自不同大小的多个分配捆绑在某个标识符下,并删除具有给定标识符的所有分配。
  4. 线程安全的

你的意思是想找一个具有这些属性的库吗?还是想要关于如何自己实现它的信息? - Giorgio
我想找到具有这些属性的库 :) - Avi Zrachya
你只能使用C语言吗?还是可以使用C++? - Nicolas Guillaume
1
你确定你需要类似这样的东西吗?你是否已经确认操作系统/编译器提供的内存管理工具存在问题呢? - Jonathan Grynspan
4个回答

8

我认为samba开发的优秀的talloc可能是您正在寻找的东西。我最感兴趣的部分是从talloc返回的任何指针都是有效的内存上下文。他们的例子是:

struct foo *X = talloc(mem_ctx, struct foo);
X->name = talloc_strdup(X, "foo");
// ...
talloc_free(X); // frees memory for both X and X->name

作为对你提出的各个主要问题的回应:
(1) 对于这种情况,我不确定什么是反碎片化。在 C 语言中,无论如何都不会得到紧凑型垃圾回收机制,因此我认为你的选择有些有限。
(2) 它宣传自己只比普通的 malloc(3) 慢 4%,速度非常快。
(3) 参见上述示例。
(4) 只要不同的线程使用不同的上下文并且底层的 malloc 是线程安全的,它就是线程安全的。

这是最接近我所需的东西。但由于它具有非常特定的需求,我最终开发了自己的解决方案。我可能会将其发布在开源项目下。 - Avi Zrachya

2

你有没有研究过以下两种内存分配器:

这两个分配器都利用了内存池,但大多数情况下对用户来说是透明的。

通常情况下,自定义内存池可以获得最佳性能(可以根据模式进行优化)。我最终为不同的访问模式编写了几个自定义内存池。


我认为它们两个基本上都是从dlmalloc中复制的 :) - Foo Bah

2

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接