TCMalloc Allocator для STL - PullRequest
       57

TCMalloc Allocator для STL

3 голосов
/ 14 марта 2011

Я хочу использовать TCMalloc с контейнерами STL, поэтому мне нужен распределитель, созданный с помощью TCMalloc (например, tbb_allocator с TBB malloc).Я не могу найти ничего документация 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 ]

7 голосов
/ 05 апреля 2011

Класс STL_Allocator в TCMalloc - это класс адаптера: вы создать его с (более простым) классом Alloc , обеспечивающим Allocate и Free методами, как в цитируемом вами комментарии, и -voila- вы получите класс, который реализует все требования для STL allocator (перейдите по ссылке для ознакомительной статьи о что такое STL-распределители и как их реализовать).

Примеры использования включают simple_alloc класс, который Null Set составлен в другой ответ , но в TCMalloc есть пример источники: MyAllocator класс в файле memory_region_map.h .

Обратите внимание, однако, что заголовочный файл, определяющий STL_Allocator, является внутренний один и не устанавливается как часть общедоступного файлы библиотеки TCMalloc.

Тем не менее, обратите внимание, что нет необходимости использовать пользовательский распределитель извлечь выгоду из TCMalloc в коде C ++: если стандартный распределитель использует malloc () в какой-то момент, вам просто нужно предварительно загрузить или связать с TCMalloc и это все. Если вы используете компилятор GNU C ++, вы можете #include <ext/malloc_allocator.h> использовать распределитель, который просто переносит malloc () без дополнительной логики.

1 голос
/ 14 марта 2011

Я не знаю, сработает ли это, но попробуйте эту простую переноску 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);
    }
}
...