Создание объекта в boost::singleton_pool

Я пытаюсь использовать boost::singleton_pool для создания большого количества объектов типа "Порядок" в высокопроизводительном критически важном многопоточном приложении. Глядя на документацию, это то, что я должен делать,

struct OrderTag{};
typedef boost::singleton_pool<OrderTag, sizeof(Order)> OrderPool; 

boost::singleton_pool имеет статическую функцию-член malloc, которая возвращает указатель на void*, но мне нужно создавать объекты типа Order в OrderPool, вызывая его конструктор. Должен ли я использовать boost::pool_allocator вместе с singleton_pool для этого?

Благодарю.

2 ответа

Короче говоря: нет. Сама реализация boost:: pool_allocator использует boost::singleton_pool и предоставляет интерфейс, такой как std:: allocator, так что вы можете использовать его с контейнерами STL (но не только с STL и не только с контейнерами), такими как vector, list и т. д. Концепция UserAllocator не похожа на boost:: pool_allocator, но это вещь, которая контролирует управление памятью на самом низком уровне. Например, я написал UserAllocator, который выделяет память через функцию mmap() и не использует кучу вообще.

Поэтому для создания объектов типа "Порядок" вы должны использовать boost:: pool_allocator или boost:: fast_pool_allocator. В вашем случае нет необходимости использовать boost::singleton_pool напрямую.

Ты можешь использовать singleton_pool с размещением new как это:

Order* p = new (OrderPool.malloc()) Order(/* add ctor parameters if any*/);

или использовать boost::object_pool<Order>

Другие вопросы по тегам