Ste*_*epp 2 c++ memory-management hierarchical
我的应用程序主要是分层组织的,所以我发现像APR内存池这样的东西是最好的方法.
虽然在这里和这里阅读关于C++ placement new帖子的SO ,以及一个更通用的C分配问题,我正在考虑手工制作分层池分配器,如同一篇文章中所建议的那样,但在纯NYI传统中,我首先要问的是这样的事情是否已经存在.
它还可以具有能够将未使用的内存返回给OS的良好属性(因为可以完成分配mmap(MAP_ANON)),或者可以像这里建议的Ferrucico那样从堆栈分配.
我知道另一个好的分层内存分配器,但它malloc在底层调用.
talloc是一个基于分层池的内存分配器,带有析构函数.它是Samba4中使用的核心内存分配器,并且在Samba4开发的许多方面产生了巨大的差异.
要开始使用talloc,我建议您阅读talloc指南.
话虽这么说,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
Run Code Online (Sandbox Code Playgroud)
小心你是否降低它; 默认情况下,不会#define DEFAULT_MMAP_MAX 65536使用分配多个部分mmap.这可以改变mallopt(M_MMAP_MAX, count),但使用许多mmaps有开销.
环境变量MALLOC_MMAP_THRESHOLD_等也将设置这些选项.
显然,malloc分配的内存mmap被释放munmap.我不确定在Glibc源代码之外的任何地方是否有任何记录,或者有任何兼容性保证.