私は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. Googleアクションパッケージの「暗黙的なトリガー」とは何ですか?
- 5. 「暗黙のデータベース・シーケンス」とは何ですか?
- 6. Scalaの暗黙的な変換と暗黙的なパラメータの関係は何ですか?
- 7. 共有ワーカーとは何ですか?ワーカーと共有ワーカーの違いは?
- 8. 暗黙の変換:以下の警告は有効ですか?
- 9. C++の暗黙のデフォルトコンストラクタのポイントは何ですか?
- 10. Qtでの暗黙的な共有の概念についての混乱
- 11. 暗黙値と同じではない暗黙[機能2]
- 12. Postgresの「暗黙的なシーケンス」と「暗黙的なインデックス」は何を意味しますか?
- 13. play/scala、暗黙のリクエスト=>意味は何ですか?
- 14. DateTimeから暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙変換に変換することができません
- 15. 共有メモリのオーバーレイは何ですか?
- 16. 有限差分のOpenMDAO暗黙状態
- 17. 角度2には何が$暗黙ですか?
- 18. 暗黙的に変換するときに暗黙のany2stringaddシンボル
- 19. オプションと暗黙的にアンラップされたオプションの違いは何ですか?
- 20. IdentityServer3の暗黙的なフローではなく、暗黙的なjavascript
- 21. C++で暗黙的にリンクされているC++とは何ですか?
- 22. スカラ:暗黙的に暗黙のクラスに
- 23. 暗黙のMakefileは
- 24. 共有ライブラリ内のテンプレートクラスは、暗黙的で明示的なインスタンス化でのみ動作します
- 25. 暗黙的なパラメータ値自体は暗黙的な値ですか?
- 26. 暗黙的な変換と暗黙のクラス
- 27. JSP暗黙オブジェクトはシングルトンオブジェクトですか?
- 28. Cの危険な暗黙の - >符号なし変換を修正または共有しますか?
- 29. は暗黙的に共有ライブラリにランタイム/ cgoを含めることができません
- 30. GAのフィットネス共有とニッチ数の意味は何ですか?
あなたはどのように動作するかについての優れた説明を提供するドキュメントへのリンクを与えました。それは、[マルチスレッドアプリケーションでの原子参照のカウントのしくみを説明しているスレッドドキュメント](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