23 General utilities library [utilities]

23.12 Memory resources [mem.res]

23.12.6 Class monotonic_­buffer_­resource [mem.res.monotonic.buffer]

23.12.6.2 monotonic_­buffer_­resource members [mem.res.monotonic.buffer.mem]

void release();

Effects: Вызывает по upstream_­rsrc->deallocate() мере необходимости для освобождения всей выделенной памяти.

[ Note: Память возвращается обратно, upstream_­rsrc даже если некоторые блоки, которые были выделены из this , не были освобождены this. ] end note

memory_resource* upstream_resource() const;

Returns: Ценность upstream_­rsrc.

void* do_allocate(size_t bytes, size_t alignment) override;

Returns: Указатель на выделенное хранилище ([basic.stc.dynamic.deallocation]) размером не менее bytes. Размер и выравнивание выделенной памяти должны соответствовать требованиям для класса, производного от memory_­resource.

Effects: Если неиспользуемое пространство в current_­buffer может уместиться в блоке с указанными bytes и alignment, то выделите возвращаемый блок из current_­buffer; в противном случае устанавливается current_­buffer значение upstream_­rsrc->allocate(n, m), где n не меньше max(bytes, next_­buffer_­size) и m не меньше alignment, и увеличивается next_­buffer_­size на коэффициент роста, определяемый реализацией (который не обязательно должен быть целым), затем выделять блок возврата из вновь выделенного current_­buffer.

Throws: Ничего, разве что upstream_­rsrc->allocate() кидает.

void do_deallocate(void* p, size_t bytes, size_t alignment) override;

Effects: Никто.

Throws: Ничего такого.

Remarks: Память, используемая этим ресурсом, монотонно увеличивается до тех пор, пока не будет уничтожена.

bool do_is_equal(const memory_resource& other) const noexcept override;

Returns: this == dynamic_­cast<const monotonic_­buffer_­resource*>(&other).