私はC++でゲームエンジンライブラリを構築しています。少し前にQtを使ってアプリケーションを構築していましたが、その使用方法には魅力的でした。Implicit Sharing。私は、誰かがこのテクニックをより詳細に説明できるかどうか、あるいは実際にこの簡単な例を提供できるかどうか疑問に思っています。暗黙の共有とは何ですか?
答えて
暗黙的な共有の背後にある重要なアイデアは、より一般的な用語copy-on-writeを使用しています。 copy-on-writeの背後にあるアイデアは、各オブジェクトを実際の実装へのポインタの周りのラッパーとして機能させることです。各実装オブジェクトは、その中へのポインタの数を追跡します。ラッパーオブジェクトで操作が実行されるたびに、実際の作業を行う実装オブジェクトに転送されたばかりです。
このアプローチの利点は、これらのオブジェクトのコピーと破棄が安価であることです。オブジェクトのコピーを作成するには、ラッパーの新しいインスタンスを作成し、そのオブジェクトのポインターを実装オブジェクトを指すように設定してから、オブジェクトへのポインターの数のカウントを増やします(これは、参照カウントと呼ばれることがあります。)。、ところで)。破壊も同様です。参照カウントを1つ落としてから、誰かが実装を指しているかどうかを確認します。そうでない場合は、そのリソースを解放します。さもなければ、私たちは何もせず、誰かが後でクリーンアップを行うと仮定します。
このアプローチの課題は、複数の異なるオブジェクトがすべて同じ実装を指していることです。つまり、誰かが実装を変更すると、その実装を参照するすべてのオブジェクトが変更を参照することになります。これは非常に深刻な問題です。これを修正するために、実装が潜在的に実装を変更する可能性のある操作が実行されるたびに、オペレーションは参照カウントが同じかどうかを調べることによって他のオブジェクトも実装を参照するかどうかをチェックします。操作はすぐに進めることができます。変更が伝播する可能性はありません。データを参照する少なくとも1つの他のオブジェクトがある場合、ラッパーはまずその実装のディープ・コピーを作成し、そのポインターを新しいオブジェクトを指すように変更します。今私たちは分かち合うことができないことを知っています。変更は面倒なく行われます。
実際の例をご覧になりたい場合は、講義の例15.0と16.0をStanford's introductory C++ programming courseからご覧ください。このテクニックを使用して単語のリストを保持するオブジェクトを設計する方法を示します。
希望すると便利です。
- 1. Qt、暗黙の共有オブジェクト、削除時に何が起こるのですか?
- 2. Javaの暗黙のコンストラクタとは何か
- 3. C++の暗黙の逆参照とは何ですか?
- 4. 「暗黙のデータベース・シーケンス」とは何ですか?
- 5. Scalaの暗黙的な変換と暗黙的なパラメータの関係は何ですか?
- 6. Postgresの「暗黙的なシーケンス」と「暗黙的なインデックス」は何を意味しますか?
- 7. DateTimeから暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙変換に変換することができません
- 8. 共有メモリのオーバーレイは何ですか?
- 9. 暗黙のMakefileは
- 10. 暗黙のパラメータと関数
- 11. Typdefsと暗黙のキャスト
- 12. 暗黙のパラメータ
- 13. は、暗黙的に
- 14. Javaの暗黙のメソッド/パラメータですか?
- 15. Javaの暗黙のオブジェクト型ですか?
- 16. 共有式と配列式の違いは何ですか?
- 17. 共有ポインタとの取引は何ですか?
- 18. 排他ロックと共有ロックの違いは何ですか?
- 19. 暗黙の演算子ですか?
- 20. 暗いテキスト(暗黙でない)のプレースホルダー
- 21. mysqlクエリと暗黙的に
- 22. Lispでの暗黙のプログラミング
- 23. 暗黙の変換は、ARC
- 24. 暗黙の宣言は、C99
- 25. パラレルプログラミングでの「偽の共有」とは何か.net 4.0
- 26. dartの暗黙的なキャスト演算子の構文は何ですか?
- 27. 暗黙的/明示的な結合の違いは何ですか?
- 28. 暗黙のクラス対形質への暗黙の変換
- 29. 暗黙ConfigurationElementCollectionのセクション
- 30. Android暗黙のインテント
あなたはどのように動作するかについての優れた説明を提供するドキュメントへのリンクを与えました。それは、[マルチスレッドアプリケーションでの原子参照のカウントのしくみを説明しているスレッドドキュメント](http://doc.trolltech.com/latest/threads-modules.html#threads-and-implicitly-shared-classes)への参照です)。まだ不明な点がある場合は、その詳細についてさらに詳しく質問する必要があります。そして、あなたは常にQtのソースを見ることができることを忘れないでください。 –
*暗黙的な共有*の他の名前は* copy-on-write *です。あなたはこのような他の名前に言及している質問を見てみるといいかもしれません:http://stackoverflow.com/questions/628938/what-is-copy-on-write –
私は暗黙の共有はちょうどQtです[コピーオンライト](https://en.wikipedia.org/wiki/Copy-on-write)の実装。 – HelloGoodbye