2012-06-20 3 views
4

Я хотел бы использовать некоторое управление памятью, совместимое с C++ std, в виде класса, производного от std::allocator, но в состоянии выделить куски памяти и освободить &, освободив их в меньших частях. Я только нашел boost :: pool, но это не соответствует std в вышеупомянутом смысле. Есть ли что-нибудь более полезное, или я должен сам это кодировать?Какие C++-совместимые пользовательские распределители доступны?

(Обратите внимание, что std::allocator часто бесполезен для выделения много мелких объектов, то есть при использовании std::list.)

РЕДАКТИРОВАТЬ для уточнения.

Скажет, я хочу использовать std::list из множества мелких объектов, а затем реализации std::allocator, которые выделяют каждый объект с помощью ::new вызывает значительные накладные расходы во время выполнения (но и память, я думаю). Гораздо эффективнее выделять большие куски объектов и раздавать их один за другим. Для этого мне нужен std-совместимый распределитель (он не должен быть получен из std::allocator, но должен реализовывать ту же концепцию), который может быть использован с любым контейнером библиотеки std и обеспечивает необходимое управление памятью, в идеале позволяющее мне рассказать об этом сколько объектов я могу выделить отдельно.

+1

В чем проблема с распределителями Boost.Pool? Почему вы говорите, что они не соответствуют стандарту? – interjay

+0

Просьба указать, есть ли у вас какие-либо особые требования к распределению/бесплатно. –

+0

@ Karthik и @interjay Предположим, что я хочу использовать 'std :: list' (как упоминалось в исходном вопросе), но избегайте выделения многих отдельных объектов. – Walter

ответ

1

GCC предоставляет несколько extension allocators в качестве альтернативы std::allocator.

Вы действительно не сказали, каковы ваши требования, поэтому нельзя сказать, подходит ли вам какой-либо из них.

Редактировать следующие редактирования параметров порядка:

Say, я хочу использовать std::list из множества мелких объектов, то реализаций std::allocator которые выделяют каждый объект с помощью ::new вызывает значительные накладные расходы во время выполнения (но и память, я думаю).

Почему так же память? Накладные расходы дополнительных указателей в каждом узле std::list будут представлены независимо от того, идет ли память от new или пользовательского распределителя. Вы просто имеете в виду бухгалтерию, выполняемую кучей, чтобы отслеживать все мелкие уголки?

Гораздо эффективнее выделять большие куски предметов и раздавать их один за другим.

Вы измерили его?

Если вы не хотите накладных расходов на выделение множества отдельных узлов, вы уверены, что std::list - это правильный контейнер? Как насчет vector или deque?

boost::stable_vector по-прежнему основан на узлах, но имеет меньшую накладную память для каждого узла, чем std::list.

boost::flat_map<int, T> не узел на основе и может быть использован вместо std::list<T>

распределителей являются сложным и не всегда лучший ответ (действительные или мнимые) проблемы.

+0

+1 для подсказки расширения gcc. Что ты используешь? 'std :: allocator' для всего (вы после выполнения?) – Walter

+1

Да, обычно просто' std :: allocator' для контейнеров, пользовательский 'new' /' delete' для высокопроизводительного распределения. –