2016-02-13 3 views
2

Я хочу указать allocator для std::map. Таким образом, написание пользовательского, взяв базовый код от here от Josuttis. Я хочу использовать boost::object_pool, чтобы получить высокую производительность. Но boost::object_pool не предоставляет API выделять n непрерывных элементы, которые требуются интерфейс функцияЧтобы использовать boost :: object_pool для реализации пользовательского распределителя для карты, как выделить n непрерывных элементов с помощью boost :: object_pool?

pointer allocate (size_type num, const void* = 0)

из allocator.

Как выделить n число непрерывных элементов в boost::objet_pool? Любой другой пул объектов с открытым исходным кодом обеспечивает такую ​​же функциональность.

Я вижу boost::simple_segregated_storage имеет интерфейс

void * malloc_n(size_type n, size_type partition_sz);

но

void free_n(void * chunks, size_type n,size_type partition_sz); 

требует размера выделенных элементов, и я не думаю, что можно было легко использовать в качестве объекта в пуле.

ответ

0

Ниже приведен чистый взлом для использования boost::object_pool для реализации пользовательского allocator для std::map. Нужно протестировать решение на платформе (конкретная версия ОС, компилятор, boost и C++ std lib).

Кажется, что std::map, никогда не запрашивает непрерывную память для более чем одного элемента, так что вы можете реализовать API alloctor в pointer allocate (size_type num, const void* = 0) выделить только один элемент т.е. пару key-value как num всегда будет 1.

Я проверил случай вставки нескольких элементов, скопировал конструктор карты, вставив в карту несколько элементов с одним вызовом до map::insert, пропустив диапазон элементов, используя begin iterator и end iterator другой карты.

тестировал на RHEL7, импульс 1.57.0, GCC версии 4.8.2 20140120 (Red Hat 4.8.2-16)

+0

Хух. Какое решение? Что означает «карта», связанная с вашим вопросом? И, да ** ** курса 'map' не выделяет сразу несколько узлов (это основано на узлах, и правила недействительности итератора/ссылки подразумевают, что это не должно, если вы не хотите рисковать сценариями плохой фрагментации, aka утечки ресурсов) – sehe

+0

@sehe: проблема была, я хотел построить allocater для std :: map, используя boost :: object_pool. но пул форсированных объектов необходим для поддержки непрерывного элемента 'n' no элементов для поддержки стандартного интерфейса распределителя. Но он может быть взломан для 'std :: map', чтобы поддерживать только выделение 1 элемента за раз, поскольку это единственное требование от std :: map к распределителю –

Смежные вопросы