我的应用程序主要是在图层中进行组织,所以我发现像APR memory pools这样的东西是最好的方式。
在阅读有关C++ placement new
帖here& here和a more generic C allocation question我正在考虑按照一篇文章中的建议手工制作分层池分配器,但在纯NYI传统中我首先要问的是,这样的事情是否已经存在。
它还可以具有能够将未使用的内存返还给操作系统的良好属性(因为可以使用mmap(MAP_ANON)
进行分配)或者可以allocating from the stack建议Ferrucico { {3}}
答案 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以进行分配?