最終更新日時: 2024年08月09日 13時35分29秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<memory_resource>

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

    namespace std::pmr {
      template <class Tp>
      class polymorphic_allocator;    //C++17

      template <class Tp = byte>
      class polymorphic_allocator;    //C++20
    }

## 概要

`polymorphic_allocator`は任意の`memory_resource`実装によりメモリ確保・解放戦略に関わる実際の処理を動的に切り替えることのできるアロケータである。この様な設計は一般にStrategyパターンというデザインパターンの一つとして知られている。
このクラスと`memory_resource`の利用により、同じ静的型`polymorphic_allocator<Tp>`で実行時に異なるメモリの確保・解放戦略をとるアロケータの利用が可能になる。

C++20にてC++プログラミングにおいての基礎部品となる型（vocabulary type）となるように改修され、`polymorphic_allocator<>`の形で幅広く利用できるようになった。

## メンバ関数

### 構築・破棄

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

### メモリ確保・解放のみを行う関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`allocate` | `Tp`の指定した要素数分のメモリを確保する | C++17
`deallocate` | `Tp`の指定した要素数分のメモリを解放する | C++17
`allocate_bytes` | 指定したバイト数のメモリを確保する | C++20
`deallocate_bytes` | 指定したバイト数のメモリを解放する | C++20
`allocate_object` | 指定した型の指定した要素数分のメモリを確保する | C++20
`deallocate_object` | 指定した型の指定した要素数分のメモリを解放する | C++20

### オブジェクト構築・破棄を行う関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`construct` | 指定された領域にオブジェクトを構築する | C++17
`destroy` | 指定された領域のオブジェクトを破棄する | C++17
`new_object` | メモリを確保し指定した型の構築（`new`式相当の処理）を行う | C++20
`delete_object` | 指定した型の破棄とそのメモリ領域の解放（`delete`式相当の処理）を行う | C++20

### その他関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`select_on_container_copy_construction` | コンテナのコピー構築時に新しい`polymorphic_allocator<Tp>`を取得する | C++17
`resource` | 使用している`memory_resource`を取得する | C++17

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`value_type` | `Tp`、確保・解放を行う対象の型（不完全型を使用可能） | C++17

## 非メンバ関数

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

## バージョン

### 言語

- C++17

### 処理系

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

## 関連項目

- `memory_resource`

## 参照

- C++1z 多相アロケータとメモリプール - Faith and Brave - C++で遊ぼう
- memory_resourceについて - 本の虫
- Polymorphic Allocator in C++17 - Qiita
- 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
- P0339R6 polymorphic_allocator<> as a vocabulary type
- LWG Issue 3037. `polymorphic_allocator` and incomplete types
- LWG Issue 3036. `polymorphic_allocator::destroy` is extraneous