C中的内存池实现
我在C中寻找一个好的内存池实现。
它应该包括以下内容:
- 反碎片化。
- 超级快:)
- 能够在某个标识符下“捆绑”来自不同大小的多个分配,并删除具有给定标识符的所有分配。
- 线程安全
我认为,作为桑巴舞的一部分而开发的优秀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是线程安全的,它就是线程安全的。
你看过了吗?
- nedmalloc http://www.nedprod.com/programs/portable/nedmalloc/
- ptmalloc http://www.malloc.de/en/
两者都利用内存池,但保持对用户的透明度。
通常,您将在自己的自定义内存池中找到最佳性能(可以针对您的模式进行优化)。 我最后写了几个不同的访问模式。
对于经过彻底尝试和测试的内存池,您可能只想使用APR:
http://apr.apache.org/docs/apr/1.4/apr__pools_8h.html
请注意,单个池不是线程安全的,您必须自己处理。
bget是另一种选择。 经过充分测试和生产准备就绪。