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を使った人はいますか?

4

2 に答える 2

8

STL_AllocatorTCMallocのクラスはアダプタークラスです。引用したコメントのように 、(より単純な) Allocクラスを提供Allocateし、 メソッドを使用してインスタンス化します。-出来上がり-STLアロケーターのすべての要件を実装するクラスを取得します(リンクをたどってください)。 STLアロケータとは何か、およびSTLアロケータの実装方法に関する紹介記事を参照してください)。Free

使用例には、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 に答える