3

我想将 TCMalloc 与 STL 容器一起使用,因此我需要一个使用 TCMalloc 构建的分配器(例如带有 TBB malloc 的 tbb_allocator)。我找不到任何TCMalloc 文档(如果它被称为文档)。所以我开始探索头文件并找到一个名为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 吗?

4

2 回答 2

8

STL_AllocatorTCMalloc 中的类是一个适配器类:您使用(更简单的)Alloc提供AllocateFree您引用的注释中的方法来实例化它,并且-瞧-您将获得一个实现 STL 分配器的所有要求的类(按照链接有关 STL 分配器是什么以及如何实现的介绍性文章)。

使用示例包括Null Set在另一个答案 中起草的simple_alloc类,但 TCMalloc 源中有一个示例:文件memory_region_map.h中的类。MyAllocator

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

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

于 2011-04-04T21:56:04.990 回答
1

我不知道它是否会起作用,但试试这个简单的 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);
    }
}
于 2011-03-14T01:30:12.743 回答