pool_resource(const pool_options& opts, memory_resource* upstream); //(1)
pool_resource()
: pool_resource(pool_options(), get_default_resource()) {} //(2)
explicit pool_resource(memory_resource* upstream)
: pool_resource(pool_options(), upstream) {} //(3)
explicit pool_resource(const pool_options& opts)
: pool_resource(opts, get_default_resource()) {} //(4)
pool_resource(const pool_resource&) = delete; //(5)
概要
- (1) :
pool_options
による設定と上流memory_resource
を受けて構築 - (2) : デフォルトコンストラクタ
- (3) : 上流
memory_resource
を受けて構築 - (4) :
pool_options
による設定を受けて構築 - (5) : コピーコンストラクタ、コピー禁止
クラス名をpool_resource
としているのは説明のためのプレースホルダで、synchronized_pool_resource
とunsynchronized_pool_resource
で共通ということである。
要件
- (1)(3) :
upstream
は有効なmemory_resource
オブジェクトを指していること。(当然、nullでないこと)
引数
opts
-- 内部メモリプール設定を指定するpool_options
オブジェクトupstream
-- 利用したい上流memory_resource
へのポインタ
効果
- (1) : 内部のメモリプールを
opts
設定により調整し、上流メモリリソースとしてupstream
を利用するpool_resource
を構築する。 - (2) : デフォルト設定を使用し、
get_default_resource()
から上流メモリリソースを取得して構築。 - (3) : デフォルト設定を使用し、上流メモリリソースとして
upstream
を利用するpool_resource
を構築する。 - (4) : 内部のメモリプールを
opts
設定により調整し、get_default_resource()
から上流メモリリソースを取得して構築。
例外
upstream->allocate()
が例外を投げないのならば、すべてのコンストラクタは例外を投げない。
ただし、これらのコンストラクタがupstream->allocate()
を呼び出すかどうか、またはどの様な条件の下でupstream->allocate()
を呼び出すかは未規定。
備考
どのコンストラクタの初期化においても、上流memory_resource
の所有権を保持しない。
実装は必ずしもopts
の設定を利用しない。
例
以下ではsynchronized_pool_resource
で書いてあるが、unsynchronized_pool_resource
も同様。
#include <memory_resource>
int main() {
//(1) pool_optionsと上流メモリリソースを受けて構築
{
std::pmr::synchronized_pool_resource mr{ {1024, 4096}, std::pmr::new_delete_resource() };
}
//(2) デフォルト構築
{
std::pmr::synchronized_pool_resource mr{};
}
//(3) 上流メモリリソースだけを受けて構築
{
std::pmr::monotonic_buffer_resource mono_mr{};
std::pmr::synchronized_pool_resource mr{ &mono_mr };
}
//(4) pool_optionsだけを受けて構築
{
std::pmr::synchronized_pool_resource mr{ {4096, 4096} };
}
}
出力
バージョン
言語
- C++17
処理系
- Clang: ??
- GCC: 9.1 ✅
- Visual C++: 2017 update 6 ✅