наиболее эффективная реализация malloc для множества небольших распределений? - PullRequest
5 голосов
/ 06 сентября 2011

в моем приложении есть тонны небольших malloc / free событий с высоким уровнем детской смертности. Обычно я пишу свой собственный пул памяти, но, увидев производительность использования tcmalloc, я испытываю желание использовать замену malloc. Существуют ли какие-либо реализации с аналогичной производительностью, что и реализация с необработанным пулом памяти?

Для C ++ у меня есть другое приложение, которое танцует C ++ new / delete. Предположим, такой же высокий уровень детской смертности. Вопрос из двух частей:

1) Как реализовать пул памяти, который действует на операции new и delete?

2) Существует ли прозрачный способ, похожий на функции динамической библиотеки glibc malloc, заменить распределитель памяти new / delete для всех классов?

Ответы [ 4 ]

1 голос
/ 06 сентября 2011

Рассматривали ли вы использование буст-пулов? Я использую это для моего базового распределителя небольших объектов и не жалуюсь. Он имеет как потокобезопасные, так и небезопасные версии, а также для удобства использования. Существует также множество других специфических распределителей небольших объектов, о которых вы также можете подумать.

0 голосов
/ 11 марта 2013

Алексей Александреску Распределитель малых объектов в std::allocator упаковке: Ссылка статьи CodeProject

0 голосов
/ 23 сентября 2011

Что касается "как написать распределитель", § 20.6.9 [default.allocator] имеет это сказать о std::allocator:

#include <new>

// specialize for void:
template <> class allocator<void> {
public:
typedef void* pointer;
typedef const void* const_pointer;
// reference-to-void members are impossible.
typedef void value_type;
template <class U> struct rebind { typedef allocator<U> other; };
};

template <class T> class allocator {
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type;
template <class U> struct rebind { typedef allocator<U> other; };
allocator() throw();
allocator(const allocator&)  throw();
template <class U> allocator(const allocator<U>&)  throw();
~allocator();
pointer address(reference x) const  throw();
const_pointer address(const_reference x) const  throw();
pointer allocate(size_type, allocator<void>::const_pointer hint = 0);
void deallocate(pointer p, size_type n)  throw();
size_type max_size() const  throw();
template<class U, class... Args>
void construct(U* p, Args&&... args);
template <class U>
void destroy(U* p);
};

Возможно, вы захотите добавить вспомогательные функции-члены, которые ведут себя больше как new и delete, к которым мы привыкли.

template<class... Args>
pointer alloc_and_constr(size_type n, Args&&... args);
template <class U>
pointer destr_and_dealloc(U* p);
0 голосов
/ 06 сентября 2011

Там также jemalloc .Не уверен, насколько точно он сравнивается с tcmalloc, но он не распространяется на все распределения, как tcmalloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...