コピーオンライトにはどのようなメリットがあるのでしょうか。当然、私は個人的な意見を期待していませんが、それが技術的かつ実用的に有益な方法で具体的な方法で実際に利用できる実際のシナリオです。そして、具体的には、&
文字の入力を節約する以上のものを意味します。
明確にするために、この質問はデータ型のコンテキストにあります。割り当てまたはコピーの構築は暗黙的な浅いコピーを作成しますが、変更すると暗黙的なディープコピーが作成され、元のオブジェクトではなく変更が適用されます。
私が尋ねている理由は、COWをデフォルトの暗黙の動作として使用することのメリットを見つけられないようです。多くのデータ型に対してCOWが実装されているQtを使用します。実際にはすべて、動的に割り当てられたストレージがいくつかあります。しかし、それは実際にユーザーにどのようなメリットがありますか?
例:
QString s("some text");
QString s1 = s; // now both s and s1 internally use the same resource
qDebug() << s1; // const operation, nothing changes
s1[o] = z; // s1 "detaches" from s, allocates new storage and modifies first character
// s is still "some text"
この例でCOWを使用することで何が得られるでしょうか。
私たちがやろうとしているのがconst操作のs1
使用だけである場合、冗長であり、を使用することもできますs
。
値を変更する場合、COWは最初の非const操作までリソースコピーを遅らせるだけですが、暗黙的共有の参照カウントをインクリメントして共有ストレージから切り離すという(最小限ではありますが)コストがかかります。COWに伴うすべてのオーバーヘッドは無意味であるように見えます。
パラメータの受け渡しのコンテキストはそれほど変わらない-値を変更するつもりがない場合は、const参照として渡し、変更したい場合は、変更したくない場合は暗黙のディープコピーを作成する元のオブジェクト、または変更する場合は参照渡し。繰り返しになりますが、COWは不要なオーバーヘッドのように見え、何も実行されず、変更が元のオブジェクトから切り離されるため、必要な場合でも元の値を変更できないという制限が追加されるだけです。
したがって、COWについて知っているか、それとも知らないかに応じて、コードの目的が不明瞭になり、不要なオーバーヘッドが発生したり、予期しない動作を完全に混乱させたりして、頭を悩ませる可能性があります。
私には、不要なディープコピーを避けたい場合でも、作成するつもりでも、より効率的で読みやすいソリューションがあるようです。では、COWの実際的なメリットはどこにあるのでしょうか。このような人気のある強力なフレームワークで使用されているため、いくつかの利点があるに違いないと思います。
さらに、私が読んだことから、COWはC ++標準ライブラリでは明示的に禁止されています。私がそれに見ている詐欺がそれと何か関係があるかどうかはわかりませんが、いずれにせよ、これには理由があるはずです。
[]
演算子を使用するかに関係なく、複数のスレッドで同じ文字列を変更することは、非常に悪いデザインのようです。したがって、COWは悪い設計を可能にします-それは多くの利点のようには聞こえません:)最後の段落のポイントは有効であるように見えますが、私自身は暗黙の振る舞いの大ファンではありません-人々は当然のことと考えがちですなぜコードが期待どおりに機能しないのかを理解するのに苦労し、暗黙の動作の背後に隠されているものを確認するために彼らが理解するまで疑問を持ち続けます。