我的应用程序主要是在中组织的,所以我发现像 APR内存池将是最佳方式。

在阅读有关 C ++ placement new 的帖子时,此处& 此处更通用的C分配问题我正在考虑按照建议手工制作分层池分配器在一篇文章中,但在纯粹的纽约传统我首先要问的是,这样的事情是否已经存在。

它还可以具有能够将未使用的内存返回给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

注意你是否降低它;默认情况下,使用 mmap 分配的代码不会超过 #define DEFAULT_MMAP_MAX 65536 。这可以通过 mallopt(M_MMAP_MAX,count)进行更改,但使用许多 mmap s会产生开销。

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

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

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top