C++ 用于C++;

C++ 用于C++;,c++,memory-management,hierarchical,C++,Memory Management,Hierarchical,我的应用程序大多是分层组织的,所以我发现像这样的东西将是最好的方式 在阅读关于C++placement newposts&的文章时,我正在考虑按照一篇文章中的建议手工制作一个分层池分配器,但是在纯粹的NYI传统中,我首先要问这样的东西是否已经存在。 它还可以具有将未使用的内存返回给操作系统的良好特性(因为分配可以使用mmap(MAP\u ANON)),或者可以按照建议进行。我知道另一个很好的分层内存分配器,但它在封面下调用malloc 是一个带析构函数的基于分层池的内存分配器。它是Samba4中

我的应用程序大多是分层组织的,所以我发现像这样的东西将是最好的方式

在阅读关于
C++placement new
posts&的文章时,我正在考虑按照一篇文章中的建议手工制作一个分层池分配器,但是在纯粹的NYI传统中,我首先要问这样的东西是否已经存在。


它还可以具有将未使用的内存返回给操作系统的良好特性(因为分配可以使用
mmap(MAP\u ANON)
),或者可以按照建议进行。

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

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

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

话虽如此,Glibc的
malloc
已经使用
mmap(MAP\u ANON)
进行大于
mmap\u阈值的分配,您可以通过
mallopt(M\u mmap\u阈值,字节)
进行设置。默认情况下,它会在

/*
  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
小心,如果你降低它;默认情况下,使用
MMAP
分配的工件不超过
#定义默认值_MMAP_MAX 65536
。这可以通过
mallopt(M_MMAP_MAX,count)
进行更改,但是使用许多
MMAP
s会产生开销

环境变量
MALLOC\u MMAP\u THRESHOLD\u
等也将设置这些选项

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

Dave Hanson的单池分配器经过了仔细调整。您可以将它们链接在一起,形成分层分配器,这比从头开始滚动自己的分配器要简单


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

让我们反问一下。内存分配是否是您的应用程序中的一个瓶颈,并已通过评测得到验证?如果不是,为什么要使用自定义分配器?分层内存池也帮助消除错误的内存泄漏。“弗洛林如果你正确使用C++(容器,RAII,…),泄露的可能性很低。我甚至不记得我是什么时候追踪最后一次泄漏的。这是很久以前的事了。他们对“正确性”没有帮助,他们在不正确的代码上插上了一个创可贴。实际上,这个应用程序是临时分配几十兆字节的,然后释放它们。因此,由于我不想在两次使用之间保持未使用状态,我首先想到的是“手动”映射一些内存。但是在这里和那里读了一点之后,我认为拥有一个好的API会非常好,并促进这种使用模式的重用。它并不意味着取代整个分配(RAII对于一般用途来说非常好)你的第二个猜测是正确的,我只是尝试拥有一个比手工制作匿名MMAP更好的API。好的,在这种情况下,我非常喜欢Hanson的API——值得一看。sizeof(talloc_chunk)是88字节(2.0.8)。层次结构中的每个叶都有88个字节的权重。这是不可能的大事