GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||||||||||||||||||||||||||||||||
GeezerVison is showing cpprefjp.github.io — memory_resource - cpprefjp C++日本語リファレンス
<memory_resource> memory_resource(C++17)
インターフェースと多相アロケータ
標準
|
| 名前 | 説明 | 対応バージョン |
|---|---|---|
synchronized_pool_resource |
スレッドセーフなメモリプール | C++17 |
unsynchronized_pool_resource |
スレッドセーフではないメモリプール | C++17 |
monotonic_buffer_resource |
最後にまとめて領域を解放するmemory_resource |
C++17 |
pool_options |
pool_resourceクラスの内部プール調整のためのクラス |
C++17 |
| 名前 | 説明 | 対応バージョン |
|---|---|---|
new_delete_resource |
operator new、operator deleteを利用するmemory_resourceを取得 |
C++17 |
null_memory_resource |
確保も解放も行わないmemory_resourceを取得 |
C++17 |
set_default_resource |
デフォルトで使用されるmemory_resourceの設定 |
C++17 |
get_default_resource |
デフォルトで使用されるmemory_resourceの取得 |
C++17 |
このクラス導入以前のアロケータはPolicyベースデザインというパターンに基づく設計であったため、アロケータの型がそれを利用する型にも表れてしまっていた。
それによって、利用するアロケータが異なる型は異なるクラスとして扱われてしまいいくつか不便なところがあった。
例えば自作のアロケータoriginal_allocatorを作り、利用しようとすると以下のような問題が生じる。
std::string str1 = "string";
std::basic_string<char, std::char_traits<char>, original_allocator<char>> str2 = "string";
//型が違うので比較不可
auto r = str1 == str2;
std::vector<int> v1 = {1, 2, 3, 4};
//型が違うのでコピーできない
std::vector<int, original_allocator<int>> v2 = v1;
//比較も不可
auto r = v1 == v2;
これらの問題の解決の必要性は認識されていたが、従来のアロケータの改修は互換性の問題等から難しいために新しく多相アロケータ(polymorphic_allocator)が導入された。
多相アロケータはアロケータの実装を型に出さずに動的に切り替えることのできるアロケータであり、上記の問題を解決することができる。ただし、従来のアロケータを利用するクラスとの間では相変わらず上記の問題が残り続ける。
本ヘッダにはその多相アロケータに関連するクラスや関数群が定義されている。
またこれらの追加に伴い、標準ライブラリ内でアロケータを用いるクラスにデフォルトでpolymorphic_allocatorを利用するエイリアスが導入された。これは各クラスのヘッダ毎に宣言される。
polymorphic_allocatorを用いるエイリアスが提供されるクラス以下は全てstd::pmr名前空間配下に宣言されている。
basic_stringstringwstringu16stringu32stringdequeforward_listlistvectormapmultimapsetmultisetunordered_mapunordered_multimapunordered_setunordered_multisetmatch_resultscmatchwcmatchsmatchwsmatch