用于C ++的分层内存分配器库

时间:2009-05-07 16:11:14

标签: c++ memory-management hierarchical

我的应用程序主要是在图层中进行组织,所以我发现像APR memory pools这样的东西是最好的方式。

在阅读有关C++ placement newhere& herea more generic C allocation question我正在考虑按照一篇文章中的建议手工制作分层池分配器,但在纯NYI传统中我首先要问的是,这样的事情是否已经存在。

它还可以具有能够将未使用的内存返还给操作系统的良好属性(因为可以使用mmap(MAP_ANON)进行分配)或者可以allocating from the stack建议Ferrucico { {3}}

2 个答案:

答案 0 :(得分:5)

我知道另一个好的分层内存分配器,但它在封面下面调用malloc

  

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

     

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

话虽如此,Glibc的malloc已经使用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)件。这可以使用mmap进行更改,但使用许多MALLOC_MMAP_THRESHOLD_会产生开销。

环境变量malloc等也会设置这些选项。

显然,mmap分配给munmap的内存将被{{1}}释放。我不确定这些内容是否存在于Glibc源代码之外的任何地方,或者是否有任何兼容性保证。

答案 1 :(得分:2)

Dave Hanson的C Interfaces and Implementations有一个经过精心调整的单池分配器。您可以将它们链接在一起以构成分层分配器,这比从头开始自己滚动更简单。

的分析结果显示内存管理是一个重要的瓶颈,对吧?或者您只是想简化API以进行分配?