代码之家  ›  专栏  ›  技术社区  ›  Steve Schnepp

C++分层内存分配器库

  •  2
  • Steve Schnepp  · 技术社区  · 17 年前

    我的申请主要组织在 所以我发现 APR memory pools 最好的办法。

    在读关于 C++ placement new 帖子 here 和; here a more generic C allocation question 我想手工制作一个层次化的池分配器,正如在一篇文章中建议的那样,但是纯粹的NYI传统 我先问一下这样的东西是否已经存在。

    它还可以有一个很好的特性,即能够将未使用的内存返回给操作系统(因为可以使用 mmap(MAP_ANON) 或可能 allocating from the stack 如建议 Ferrucico here .

    2 回复  |  直到 17 年前
        1
  •  5
  •   ephemient    17 年前

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

    talloc 是一个具有析构函数的基于分层池的内存分配器。它是Samba4中使用的核心内存分配器,在Samba4开发的许多方面都有很大的不同。

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

    也就是说,格里布的 马洛克 已经使用 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 S有一个开销。

    环境变量 MALLOC_MMAP_THRESHOLD_ ETC也将设置这些选项。

    很明显,记住 马洛克 分配给 MMAP 被释放 munmap .我不确定这其中的任何一个文档是否在glibc源代码之外的任何地方记录,或者是否有任何兼容性保证。

        2
  •  2
  •   Norman Ramsey    17 年前

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

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