用于C ++的分层内存分配器库
-
08-07-2019 - |
解决方案
我知道另一个好的分层内存分配器,但它在封面下调用 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
注意你是否降低它;默认情况下,使用 mmap
分配的代码不会超过 #define DEFAULT_MMAP_MAX 65536
。这可以通过 mallopt(M_MMAP_MAX,count)
进行更改,但使用许多 mmap
s会产生开销。
环境变量 MALLOC_MMAP_THRESHOLD _
等也会设置这些选项。
显然,使用 munmap
释放 malloc
与 mmap
分配的内存。我不确定这些内容是否存在于Glibc源代码之外的任何地方,或者是否有任何兼容性保证。
其他提示
Dave Hanson的 C接口与实现有一个经过精心调整的单池分配器。您可以将它们链接在一起以构成分层分配器,这比从头开始自己滚动更简单。
你做有分析结果,显示内存管理是一个重要的瓶颈,对吗?或者您只是想简化API以进行分配?
不隶属于 StackOverflow