C中的内存池实现

时间:2011-08-15 00:23:14

标签: c memory memory-management allocation pool

我在C中寻找一个好的内存池实现。

它应包括以下内容:

  1. 反碎片。
  2. 超级快:)
  3. 能够在一些标识符下“捆绑”来自不同大小的多个分配,并删除具有给定标识符的所有分配。
  4. 线程安全

4 个答案:

答案 0 :(得分: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是线程安全的。

答案 1 :(得分:2)

你有没有看过

两者都利用内存池,但保持对用户的透明度。

通常,您会在自己的自定义内存池中找到最佳性能(可以针对您的模式进行优化)。我最后写了几个不同的访问模式。

答案 2 :(得分:2)

对于经过彻底尝试和测试的内存池,您可能只想使用APR:

http://apr.apache.org/docs/apr/1.4/apr__pools_8h.html

请注意,单个池不是线程安全的,您必须自己处理。

答案 3 :(得分:-1)

bget是另一种选择。它经过了充分的测试和生产准备。

http://www.fourmilab.ch/bget/