TCMalloc是STL的分配器

3
我想在STL容器中使用TCMalloc,所以我需要一个使用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 吗?

2个回答

8
在TCMalloc中,STL_Allocator类是一个适配器类:您可以使用(更简单的)Alloc类实例化它,该类提供像您引用的注释中的AllocateFree方法,然后 -voila- 您就得到了一个实现了所有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()而没有额外逻辑的分配器。


很抱歉,我正在使用MSVC,替换malloc是一项艰巨的任务。此外,我的应用程序需要快速分配仅两个类的内存,即使对于其中一个类,放置new new (tcmalloc :: alloc()) ClassName()也可以完美地完成。 - ali_bahoo

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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接