Создание объекта в 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>