【问题标题】:TCMalloc Allocator for STL用于 STL 的 TCMalloc 分配器
【发布时间】:2011-07-14 15:51:17
【问题描述】:

我想将 TCMalloc 与 STL 容器一起使用,因此我需要一个使用 TCMalloc 构建的分配器(例如带有 TBB malloc 的 tbb_allocator)。我找不到任何东西TCMalloc documentation(如果它被称为文档)。于是我开始探索头文件并找到一个名为STL_Allocator 的类。但是我不清楚。来自 stl_allocator.h 的报价:

// Generic allocator class for STL objects
// that uses a given type-less allocator Alloc, which must provide:
//   static void* Alloc::Allocate(size_t size);
//   static void Alloc::Free(void* ptr, size_t size);
//
// STL_Allocator<T, MyAlloc> provides the same thread-safety
// guarantees as MyAlloc.
//
// Usage example:
//   set<T, less<T>, STL_Allocator<T, MyAlloc> > my_set;
// CAVEAT: Parts of the code below are probably specific
//         to the STL version(s) we are using.
//         The code is simply lifted from what std::allocator<> provides.

而STL_Allocator模板类的定义是:

template <typename T, class Alloc>
class STL_Allocator {
//...
}

我不知道 Alloc 参数可能是什么。我应该为一些内存分配函数编写一个包装类吗?有人用过 TCMalloc 吗?

【问题讨论】:

    标签: c++ stl memory-management allocator tcmalloc


    【解决方案1】:

    TCMalloc 中的STL_Allocator 类是一个适配器类:你 使用提供Allocate 的(更简单的)Alloc 类来实例化它和 Free 引用的评论中的方法,并且 -voila- 你得到一个 实现所有要求的类 STL allocator(点击链接查看介绍性文章 什么是 STL 分配器以及如何实现)。

    使用示例包括 simple_allocNull Set 起草于another answer,但在 TCMalloc 中有一个示例 来源:文件memory_region_map.h中的MyAllocator类。

    但是请注意,定义 STL_Allocator 的头文件是 internal 一个并且不作为公共包含的一部分安装 TCMalloc 库的文件。

    也就是说,请注意不需要使用自定义分配器 从 C++ 代码中的 TCMalloc 中受益:如果标准分配器使用 malloc() 在某些时候,您只需要预加载或链接 TCMalloc 就是这样。如果您使用的是 GNU C++ 编译器,您可以#include <ext/malloc_allocator.h> 使用简单包装的分配器 malloc() 没有额外的逻辑。

    【讨论】:

    • 恐怕我正在使用 MSVC,替换 malloc 是一项艰巨的任务。此外,我需要在我的应用程序中快速分配两个类,即使其中一个放置 new new (tcmalloc::alloc()) ClassNAme() 也会完美。
    【解决方案2】:

    我不知道它是否会起作用,但试试这个 malloc 和 free 的简单包装。

    #include <cstdlib.h>
    
    struct simple_alloc {
        static void* Allocate(size_t size){
            return malloc(size);
        }
        static void Free(void* ptr, size_t size){
            free(ptr);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2020-08-10
      • 2018-08-23
      • 2011-01-08
      • 2015-09-20
      • 2011-06-21
      相关资源
      最近更新 更多