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 ✅
関連項目
参照
- 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