3.3.3 Resource Management
著者が彼の新しい本のセクションで伝えようとしていることを理解するのに問題がありThe C++ Programming Language 4th edition
ます. 著者のホームページから参照されたセクションの下にコピーしました。
3.3.3 リソース管理[tour2.copy.resource]
コンストラクター、コピー操作、移動操作、およびデストラクターを定義することにより、プログラマーは、含まれているリソース (コンテナーの要素など) の有効期間を完全に制御できます。特に、移動コンストラクターを使用すると、オブジェクトをあるスコープから別のスコープに簡単かつ安価に移動できます。そうすれば、コピーできない、またはコピーしたくないオブジェクトをスコープから移動できます。並行アクティビティ (§5.3.1) を表す標準ライブラリ スレッドと、100 万倍のベクトルを考えてみましょう。前者はコピーできませんし、後者もコピーしたくありません。
std::vector<thread> my_threads;
Vector init()
{
thread t {heartbeat}; // run heartbeat concurrently (on its own thread)
my_threads.push_back(move(t)); // move t into my_threads
Vector<double> vec;
// ... fill vec ...
return vec; // move res out of run()
}
auto v = init(); // start heartbeat and initialize v
これにより、Vector やスレッドなどのリソース ハンドルが、多くの場合、ポインターを使用する代わりになります。実際、unique_ptr などの標準ライブラリの「スマート ポインタ」は、それ自体がそのようなリソース ハンドルです (§5.2.1)。§3.4.1 まで要素型で Vector をパラメータ化できないため、標準ライブラリの vector を使用しました。
vector my_threads
多分私の質問は次のようになるはずです:とVector vec
関数内の関係は何init()
ですか? たとえば、以下のようなより単純な代替案に直面した場合、上記のコードの利点は何でしょうか。
std::vector<thread> my_threads;
thread t(hearbeat);
my_threads.push_back(move(t));
Vector<double> vec;
// ... fill vec ...