Каждый ресурс владеет выделенной памятью и освобождает её от разрушения, даже если для некоторых выделенных блоков не был вызван деллокат.
Ресурс пула состоит из набора пулов, обслуживающих запросы на различные размеры блоков. Каждый отдельный бассейн управляет коллекцией кусков, которые в свою очередь делятся на блоки однородного размера, возвращаемые с помощью вызовов do_allocate. Каждый вызов do_allocate (размер, выравнивание) отправляется в пул, обслуживающий наименьшие блоки, вмещающие по меньшей мере байты размера.
Когда конкретный бассейн исчерпан, выделение блока из этого бассейна приводит к выделению дополнительного куска памяти из распределителя вверх по течению (поставляемого при строительстве), таким образом пополняя бассейн. С каждым последующим пополнением полученный размер куска увеличивается геометрически. [Примечание: распределяя память по частям, стратегия объединения увеличивает вероятность того, что последовательные распределения будут близки друг к другу в памяти. - конец примечания ]
Запросы распределения, превышающие наибольший размер блока любого пула, выполняются непосредственно из распределителя вверх по течению.
Структураpool_optionsможет быть передана конструкторам ресурсов пула для настройки наибольшего размера блока и максимального размера фрагмента.
Классunsynchronized_pool_resourceне может быть доступен из нескольких потоков одновременно и, таким образом, позволяет избежать стоимости синхронизации полностью в однопоточных приложениях.
unsynchronized_pool_resource
public
construct/copy/destruct
Требует:вверх по течениюявляется адресом действительного ресурса памяти.
Эффекты: Конструирует объект ресурса пула, который будет получать память из верхнего потока, когда ресурс пула не может удовлетворить запрос памяти из своих собственных внутренних структур данных. Полученный объект будет содержать копию выше по течению, но не будет владеть ресурсом, на который выше по течению указывает. [Примечание: Цель состоит в том, чтобы в большинстве случаев призывы к upstream->allocate() были значительно меньше, чем призывы к this->allocate(). - Конечная нота Поведение механизма объединения настраивается в соответствии с ценностью аргумента выбора.
Бросает: Ничего, кроме бросков вверх по течению. Не уточняется, если или при каких условиях этот конструктор называет upstream->allocate().
unsynchronized_pool_resource public member functions
voidrelease();
Эффекты: Звонки звонятupstream_resource()->deallocate()при необходимости освободить всю выделенную память. [Примечание: память высвобождается обратно вupstream_resource(), даже если для некоторых выделенных блоков не было вызвано расслоение. - конец примечания ]
Возврат: Варианты, которые контролируют поведение пула этого ресурса. Значения в возвращенной структуре могут отличаться от тех, которые поставляются в конструктор ресурсов пула, в том смысле, что значения нуля будут заменены по умолчанию, определенными реализацией, а размеры могут быть округлены до неопределенной детализации.
std::size_tpool_countconst;
Возвращение: Количество бассейнов, которые будут использоваться в ресурсе бассейна.
Примечание: Нестандартное расширение.
std::size_tpool_index(std::size_tbytes)const;
Возвращение: Индекс пула, который будет использоваться для обслуживания распределенияbytes. Возвращаетсяpool_count(), еслиbytesбольшеoptions().largest_required_pool_block(ни один бассейн не будет использоваться для этого).
Возвращение: Указатель на выделенное хранилище размером не менеебайт. Размер и расположение выделенной памяти должны соответствовать требованиям для класса, полученного изMemory_resource.
Эффекты: Если пул, выбранный для блока байтов размера, не может удовлетворить запрос памяти из собственных внутренних структур данных, он вызоветupstream_resource()->allocate(), чтобы получить больше памяти. Еслибайтбольше того, что может обрабатывать самый большой пул, то память будет выделена с использованиемupstream_resource()->allocate().
Статья Class unsynchronized_pool_resource раздела The Boost C++ Libraries BoostBook Documentation Subset Boost.Container Header Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.