2011-03-13 4 views
3

TCMalloc을 STL 컨테이너와 함께 사용하고 싶습니다. 따라서 TCMalloc (TBB malloc과 함께 tbb_allocator처럼)을 사용하여 할당자를 만들어야합니다. TCMalloc documentation (문서라고 부르는 경우)을 찾을 수 없습니다. 그래서 헤더 파일을 탐색하고 STL_Allocator이라는 클래스를 찾습니다. 그러나 뭔가 명확하지 않습니다. stl_allocator.h에서 인용 :TCMalloc Allocator for STL

// 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을 사용 했습니까?

답변

1

작동 여부는 잘 모르겠지만 malloc과 무료로 간단하게 포장 해보십시오. A (간단) ALLOC 클래스 Allocate 당신이 인용 한 코멘트와 같이 Free 방법을 제공과 함께 당신이 실체화를, 그리고 당신이 얻을 -voila- :

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

TCMalloc의 STL_Allocator 클래스는 어댑터 클래스입니다 STL allocator에 대한 모든 요구 사항을 구현하는 클래스 ( 에 대한 소개 기사에 대한 링크와 구현 방법은 STL 할당자가 무엇인지)을 참조하십시오. 사용

Null Setanother answer에 기안 simple_alloc 클래스를 포함하지만, TCMalloc 소스의 예를있다 : 파일 memory_region_map.hMyAllocator 클래스.

참고 그러나, STL_Allocator을 정의하는 헤더 파일은 내부 하나이며, 대중의 일부가 TCMalloc 라이브러리의 파일을 포함로 설치되지 않았는지 확인합니다. 표준 할당이 어떤 점에서 의 malloc()을 사용하는 경우, 당신은 단지 미리로드 또는 TCMalloc와 링크해야합니다

는 C++ 코드에서 TCMalloc 혜택을 사용자 정의 할당 를 사용할 필요가 없다는 것을 유의하시기 바랍니다 말했다 그게 전부입니다. GNU C++ 컴파일러를 사용하는 경우 #include <ext/malloc_allocator.h>은 여분의 논리없이 malloc()을 단순히 래핑하는 할당자를 사용할 수 있습니다.

+0

MSVC를 사용하고 있고 malloc을 교체하는 것이 어려운 작업입니다. 또한 내 응용 프로그램에서 단 두 개의 클래스의 빠른 할당이 필요합니다. 그 중 하나에 대해서도 새로운 new (tcmalloc :: alloc()) ClassNAme()가 완벽하게 수행됩니다. –