最終更新日時: 2024年09月05日 22時04分13秒 (JST)
Yuya Asano が更新

履歴 編集

class
<memory_resource>

# std::pmr::monotonic_buffer_resource(C++17)

    namespace std::pmr {
      class monotonic_buffer_resource;
    }

## 概要

`monotonic_buffer_resource`はオブジェクトの破棄時にのみ管理しているメモリを全て解放する特殊な `memory_resource`実装である。 小さなオブジェクトを多数構築するために割り当てを行い、最後にまとめて解放するといった状況において高速なメモリ割り当てを行うことを目的としている。

このクラスはスレッドセーフではない。

## `monotonic_buffer_resource`の性質

- `deallocate`（`do_deallocate`）は何も行わない、そのためオブジェクトの破棄までメモリ使用量は単調増加する。
- 外部で確保された領域を初期メモリ領域として設定可能
- 上流メモリリソースを指定可能
- 初期メモリが無いか使い果たされると、上流メモリリソースから補充する。
- 補充されるメモリ領域サイズは以前の領域サイズよりも大きくなり、そのサイズは等比数列に従って（補充の度に）増加する。
- 単一スレッドからアクセスされることを前提としており、`allocate`と`deallocate`は互いに非同期である。
- 管理メモリの解放時は`deallocate`が呼び出されていない領域があっても全てのメモリを解放する。

## メンバ関数

### 構築・破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++17
`(destructor)` | デストラクタ | C++17
`operator=(const monotonic_buffer_resource&) = delete;` | コピー代入演算子（コピー禁止） | C++17

### メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`release` | 管理中の全てのメモリを解放する | C++17
`upstream_resource` | 利用している上流`memory_resource`を取得する | C++17

### 非仮想インターフェース（NVI）

名前 | 説明 | 対応バージョン
--- | --- | ---
`allocate` | メモリを確保する | C++17
`deallocate` | メモリを解放する | C++17
`is_equal` | オブジェクトを超えてメモリ領域の解放を行えるかを調べる | C++17

### protected オーバーライド関数（`memory_resource`実装）

名前 | 説明 | 対応バージョン
--- | --- | ---
`do_allocate` | メモリを確保する | C++17
`do_deallocate` | メモリを解放する | C++17
`do_is_equal` | オブジェクトを超えてメモリ領域の解放を行えるかを調べる | C++17

## 非メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較 | C++17
`operator!=` | 非等値比較 | C++17

## バージョン

### 言語

- C++17

### 処理系

- Clang: ??
- GCC: 9.1 ✅
- Visual C++: 2017 update 6 ✅

## 関連項目

- `memory_resource`
- `pool_resource`

## 参照

- C++1z 多相アロケータとメモリプール - Faith and Brave - C++で遊ぼう
- memory_resourceについて - 本の虫
- P0220R1 Adopt Library Fundamentals V1 TS Components for C++17 (R1)
- P0337r0 | Delete operator= for polymorphic_allocator
- Working Draft, C++ Extensions for Library Fundamentals, Version 2