2

我的应用程序主要是分层组织的,所以我发现像APR 内存池这样的东西是最好的方法。

在阅读关于此处此处C++ placement new的帖子的 SO以及更通用的 C 分配问题时,我正在考虑按照一篇帖子中的建议手工制作分层池分配器,但在纯粹的 NYI 传统中,我首先要问这样的事情是否已经存在。

它还可以具有能够将未使用的内存返还给操作系统的良好特性(因为可以使用 完成分配mmap(MAP_ANON)),或者可以按照Ferrucico建议从堆栈分配

4

2 回答 2

5

我知道另一个很好的分层内存分配器,但它在幕后调用malloc

talloc是一个基于分层池的内存分配器,带有析构函数。它是 Samba4 中使用的核心内存分配器,在 Samba4 开发的许多方面都产生了巨大的影响。

要开始使用talloc,我建议您阅读talloc 指南

话虽如此,Glibcmalloc已经使用mmap(MAP_ANON)了大于 的分配mmap_threshold,您可以通过mallopt(M_MMAP_THRESHOLD, bytes). 默认情况下,它在

/*
  MMAP_THRESHOLD_MAX and _MIN are the bounds on the dynamically
  adjusted MMAP_THRESHOLD.
*/

#ifndef DEFAULT_MMAP_THRESHOLD_MIN
#define DEFAULT_MMAP_THRESHOLD_MIN (128 * 1024)
#endif

#ifndef DEFAULT_MMAP_THRESHOLD_MAX
  /* For 32-bit platforms we cannot increase the maximum mmap
     threshold much because it is also the minimum value for the
     maximum heap size and its alignment.  Going above 512k (i.e., 1M
     for new heaps) wastes too much address space.  */
# if __WORDSIZE == 32
#  define DEFAULT_MMAP_THRESHOLD_MAX (512 * 1024)
# else
#  define DEFAULT_MMAP_THRESHOLD_MAX (4 * 1024 * 1024 * sizeof(long))
# endif
#endif

小心降低它;默认情况下,#define DEFAULT_MMAP_MAX 65536使用mmap. 这可以用 更改mallopt(M_MMAP_MAX, count),但使用 manymmap会产生开销。

环境变量MALLOC_MMAP_THRESHOLD_等也将设置这些选项。

显然,malloc分配的内存是用mmap释放的munmap。我不确定这些是否记录在 Glibc 源代码之外的任何地方,或者是否有任何兼容性保证。

于 2009-05-07T17:34:58.467 回答
2

Dave Hanson 的C 接口和实现有一个精心调整的单池分配器。您可以将它们链接在一起以创建一个分层分配器,这比从头开始滚动您自己的更简单。

确实有分析结果显示内存管理是一个重要的瓶颈,对吗?或者您只是想简化分配的 API?

于 2009-05-07T21:29:11.913 回答