Я заинтересован в использовании нескольких стандартных карт
Мой вопрос заключается в том, что, несмотря на использование чего-то вроде Boost pool_alloc для управления размещением самих элементов, будет ли карта std по-прежнему использовать небольшие куски памяти кучи в качестве некоторой формы издержек контейнера, которая НЕ будет управляться при помощи boost pool_alloc? Я имею в виду что-то вроде указателя на элементы в отношении использования самой карты STD?
Короткая версия
Тип карты, такой как:
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 и не смог найти ничего, определяющего, как такая структура должна быть размещена. Либо я не нашел нужную часть, либо она не указана. Не использовать определенный пользователем тип распределителя может показаться немного бессмысленным.
Других решений пока нет …