答えて

7

ヒープ上のデータを保持するオブジェクトの値セマンティクスを最適化するために、書込みと移動の両方のセマンティクスが使用されています。例えば、std::stringは、コピーオンライトオブジェクトと移動可能オブジェクトの両方として実装されています。

コピーオンライトと移動セマンティクスは似ています。「コピー」を十分に緩やかに定義すると、それらを使用して「コピー」を最適化することができます。私は時々、移動セマンティクスをコピー時のコピーとして記述し、参照カウントが0または1に制限されているため、参照カウントを含むフィールドが最適化されます。

std :: libのすべてのコンテナは移動セマンティクスを使用するようになり、以前はコピーオンライトを許可されていたstd::stringさえ禁止されています。今日、新しい顧客コンテナを作成していた場合は、コピーオンライトを選択する前に移動セマンティクスを使用します。

C++ 11ではまだコピーオンライトが使用されています。あなたのデータ構造がまれに書かれることはほとんどありませんが、多くのクライアントが同じ値のコピーを保持しているため、コピー・オン・ライトは大きな勝利につながります。

たとえば、複雑なドキュメントの元に戻すリストを保持するのに便利なようにコピーオンライトを見ました。任意のコミット(状態を保存する場所)では、最後のコミット以降に大きな文書の小さな部分だけが変更されています。したがって、状態を保存するために文書のコピーを作成することは、多数の参照カウントを更新し、実際に小さな部分に変更(コピーオンライト)を行うことを意味します。

+0

copy-on-writeセマンティクスを例えば次のように埋め込むことは可能でしょうか?アロケータ?もちろん、必要に応じて実際にアロケータを使用するようにインタフェース関数を変更します。私はstd :: allocatorが必要なインターフェイスを持っているのを疑う? – rubenvb

6

コピーオンライトと移動セマンティクスは全く異なる概念であり、それぞれ異なる目的を果たします。一般的なケースでは、の範囲外になるため、という関数からオブジェクトを返すのは、事実上の移動です。

同時に生きているの内容を共有することができます。移動セマンティクスでは、1つのオブジェクトだけが特定の時点の内容を持ちます。

同じデータ(読み取り専用)と制御ブロック(読み取り/書き込み)にアクセスする可能性のある複数のオブジェクトがある可能性があるため、copy-on-writeはマルチスレッド環境で問題があります。スレッドセーフな方法。

+0

現在、長いロックを避けるためにマルチスレッド環境で使用されているため、コンテナの実装を書く上でコピーを探しています。私のケースでは、マスターコンテナと、そのコンテンツを安全に反復できる数のイテレータがあります。アトミックな参照カウントを使用した書き込みでコピーすると、私の仕事ができます。 – Keinstein

関連する問題