2011-01-09 6 views
12

私はC++でゲームエンジンライブラリを構築しています。少し前にQtを使ってアプリケーションを構築していましたが、その使用方法には魅力的でした。Implicit Sharing。私は、誰かがこのテクニックをより詳細に説明できるかどうか、あるいは実際にこの簡単な例を提供できるかどうか疑問に思っています。暗黙の共有とは何ですか?

+5

あなたはどのように動作するかについての優れた説明を提供するドキュメントへのリンクを与えました。それは、[マルチスレッドアプリケーションでの原子参照のカウントのしくみを説明しているスレッドドキュメント](http://doc.trolltech.com/latest/threads-modules.html#threads-and-implicitly-shared-classes)への参照です)。まだ不明な点がある場合は、その詳細についてさらに詳しく質問する必要があります。そして、あなたは常にQtのソースを見ることができることを忘れないでください。 –

+0

*暗黙的な共有*の他の名前は* copy-on-write *です。あなたはこのような他の名前に言及している質問を見てみるといいかもしれません:http://stackoverflow.com/questions/628938/what-is-copy-on-write –

+0

私は暗黙の共有はちょうどQtです[コピーオンライト](https://en.wikipedia.org/wiki/Copy-on-write)の実装。 – HelloGoodbye

答えて

31

暗黙的な共有の背後にある重要なアイデアは、より一般的な用語copy-on-writeを使用しています。 copy-on-writeの背後にあるアイデアは、各オブジェクトを実際の実装へのポインタの周りのラッパーとして機能させることです。各実装オブジェクトは、その中へのポインタの数を追跡します。ラッパーオブジェクトで操作が実行されるたびに、実際の作業を行う実装オブジェクトに転送されたばかりです。

このアプローチの利点は、これらのオブジェクトのコピーと破棄が安価であることです。オブジェクトのコピーを作成するには、ラッパーの新しいインスタンスを作成し、そのオブジェクトのポインターを実装オブジェクトを指すように設定してから、オブジェクトへのポインターの数のカウントを増やします(これは、参照カウントと呼ばれることがあります。)。、ところで)。破壊も同様です。参照カウントを1つ落としてから、誰かが実装を指しているかどうかを確認します。そうでない場合は、そのリソースを解放します。さもなければ、私たちは何もせず、誰かが後でクリーンアップを行うと仮定します。

このアプローチの課題は、複数の異なるオブジェクトがすべて同じ実装を指していることです。つまり、誰かが実装を変更すると、その実装を参照するすべてのオブジェクトが変更を参照することになります。これは非常に深刻な問題です。これを修正するために、実装が潜在的に実装を変更する可能性のある操作が実行されるたびに、オペレーションは参照カウントが同じかどうかを調べることによって他のオブジェクトも実装を参照するかどうかをチェックします。操作はすぐに進めることができます。変更が伝播する可能性はありません。データを参照する少なくとも1つの他のオブジェクトがある場合、ラッパーはまずその実装のディープ・コピーを作成し、そのポインターを新しいオブジェクトを指すように変更します。今私たちは分かち合うことができないことを知っています。変更は面倒なく行われます。

実際の例をご覧になりたい場合は、講義の例15.0と16.0をStanford's introductory C++ programming courseからご覧ください。このテクニックを使用して単語のリストを保持するオブジェクトを設計する方法を示します。

希望すると便利です。

関連する問題