Amonotonic_buffer_resourceявляется специализированным ресурсом памяти, предназначенным для очень быстрого распределения памяти в ситуациях, когда память используется для создания нескольких объектов, а затем высвобождается сразу, когда объект ресурса памяти разрушается. Он обладает следующими качествами:
Призыв к расщеплению не имеет эффекта, поэтому количество потребляемой памяти монотонно увеличивается до тех пор, пока ресурс не будет уничтожен.
Программа может поставлять исходный буфер, который распределитель использует для удовлетворения запросов памяти.
Когда первоначальный буфер (если таковой имеется) исчерпан, он получает дополнительные буферы из вышестоящего ресурса памяти, поставляемого при строительстве. Каждый дополнительный буфер больше предыдущего после геометрической прогрессии.
Он предназначен для доступа из одного потока управления за раз. В частности, призывы к выделению и размещению не синхронизируются друг с другом.
Он владеет выделенной памятью и освобождает её от разрушения, даже если для некоторых выделенных блоков не был вызван деллокат.
monotonic_buffer_resource
public
construct/copy/destruct
Требуется:upstreamдолжен быть адресом действительного ресурса памяти илиnullptr
Эффекты: Еслиupstreamне является nullptr, установит внутренний ресурс наupstream, чтобы получить _default_resource() в противном случае. Устанавливает внутреннийcurrent_bufferкnullptrи внутреннийnext_buffer_sizeк определенному размеру реализации.
Требует:upstreamдолжен быть адресом действительного ресурса памяти илиnullptrиначальный размердолжен быть больше нуля.
Эффекты: Еслиupstreamне является nullptr, установит внутренний ресурс наupstream, чтобы получить_default_resource() в противном случае. Устанавливает внутреннийcurrent_bufferнаnullptrиnext_buffer_sizeкак минимум наinitial_size.
:выше по течению,буфер_размердолжен быть не больше количества байтов в буфере.
Эффекты: Еслиupstreamне является nullptr, установит внутренний ресурс наupstream, чтобы получить_default_resource() в противном случае. Устанавливает внутреннийток_буфернабуфер, аследующий_буфер_sizeнабуфер_size(но не менее, чем размер, определенный реализацией), затем увеличиваетследующий_буфер_sizeпосредством определяемого реализацией фактора роста (который не обязательно должен быть интегральным).
Эффекты:upstream_resource()->deallocate()при необходимости освободить всю выделенную память. [Примечание: память возвращается кupstream_resource(), даже если некоторые блоки, которые были выделены из этого, не были распределены из этого. - конец примечания
Возвращение: Количество байтов хранилища, доступных для указанного выравнивания, и количество байтов, потраченных впустую из-за запрошенного выравнивания.
Возвращение: Указатель на выделенное хранилище размером не менееbytes. Размер и расположение выделенной памяти должны соответствовать требованиям для класса, полученного изmemory_resource.
: Если неиспользуемое пространство во внутреннемcurrent_bufferможет поместить блок с указанными байтами и выравниванием, то выделите возвратный блок из внутреннегоcurrent_buffer; в противном случае установите внутреннийcurrent_bufferвupstream_resource()->allocate(n, m), гдеnне меньшеmax(bytes, next_buffer_size)иmне меньше выравнивания, и увеличьтеnext_buffer_sizeпосредством определяемого реализацией фактора роста (который не обязательно должен быть интегральным), затем выделите возвратный блок из вновь выделенного внутреннегоcurrent_buffer
Бросок: Ничего, если толькоupstream_resource()->allocate()не бросит.
monotonic_buffer_resource
public
public data members
staticconststd::size_tinitial_next_buffer_size;
Количество байтов, которое будет запрошено по умолчанию в первом вызове на верхний распределитель
Примечание: Нестандартное расширение.
Статья Class monotonic_buffer_resource раздела The Boost C++ Libraries BoostBook Documentation Subset Boost.Container Header Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.