Skip to content

Latest commit

 

History

History
115 lines (91 loc) · 6.72 KB

memory_resource.md

File metadata and controls

115 lines (91 loc) · 6.72 KB

memory_resource

  • memory_resource[meta header]
  • cpp17[meta cpp]

<memory_resource>ヘッダでは、ポリモルフィックなアロケータ(多相アロケータ、型に依存しないアロケータ)とそれを実装するためのインターフェース、及びその標準実装を提供する。

インターフェースと多相アロケータ

名前 説明 対応バージョン
memory_resource アロケータ実装を抽象化するためのインターフェース C++17
polymorphic_allocator 型によらないアロケータ実装を利用可能なアロケータ C++17

標準memory_resource実装

名前 説明 対応バージョン
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 newoperator 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名前空間配下に宣言されている。

バージョン

言語

  • C++17

処理系

関連項目

<scoped_allocator>

参照