Как полностью управлять распределением памяти в куче стандартных контейнеров, таких как map?

Я заинтересован в использовании нескольких стандартных карт и я хочу, чтобы все они выделяли элементы из общего пула памяти. Из того, что я читал до сих пор, я могу использовать собственные распределители, такие как Boost pool_alloc, чтобы добиться этого.

Мой вопрос заключается в том, что, несмотря на использование чего-то вроде Boost pool_alloc для управления размещением самих элементов, будет ли карта std по-прежнему использовать небольшие куски памяти кучи в качестве некоторой формы издержек контейнера, которая НЕ будет управляться при помощи boost pool_alloc? Я имею в виду что-то вроде указателя на элементы в отношении использования самой карты STD?

4

Решение

Короткая версия

Тип карты, такой как:

typedef std::map<
int,
int,
less<int>,
boost::pool_allocator<pair<const int, int> >
>
AMapType;

Будет делать все необходимое распределение по мере роста, используя boost :: pool_allocators. Часть начальной структуры, скорее всего, будет создана в стеке. Сколько и какая будет точная структура, зависит от реализации.

Allocator Rebind

Вышесказанное возможно благодаря использованию allocator::rebind

Все распределители, соответствующие std :: allocator (например, boost :: pool_allocator), предоставляют структуру шаблона повторного связывания в виде:

template<class U> struct rebind{
typedef AllocatorType<U> other;
};

Это может быть использовано для получения одного и того же типа распределителя для другого типа:

typedef AllocatorOfOther AllocatorType::rebind<ADifferentType>::other;

gcc std :: map внутренняя структура

Реализация g ++ std :: map (я проверил 4.7.3 и 4.1.1) построена исключительно из одного типа узла. Это включает пару ключ-значение и указатели и бит цвета, необходимые для структуры rbTree. Чтобы выделить это, он определяет распределитель Node, используя структуру rebind от предоставленного пользователем распределителя. Это используется для всех распределений, которые он делает по мере роста карты. Каждый новый узел выделяется в одном выделении.

Стандарт

Я проверил стандарт C ++ 11 и не смог найти ничего, определяющего, как такая структура должна быть размещена. Либо я не нашел нужную часть, либо она не указана. Не использовать определенный пользователем тип распределителя может показаться немного бессмысленным.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]