私はC++でゲームエンジンライブラリを構築しています。少し前に、私はQtを使用してアプリケーションを構築していましたが、暗黙の共有の使用にかなり魅了されていました。誰かがこのテクニックをより詳細に説明できるのか、それとも実際のこの簡単な例を提供できるのだろうかと思います。
1 に答える
暗黙の共有の背後にある重要なアイデアは、より一般的な用語copy-on-writeを使用しているようです。コピー オン ライトの背後にある考え方は、各オブジェクトを実際の実装へのポインターのラッパーとして機能させることです。各実装オブジェクトは、それへのポインターの数を追跡します。ラッパー オブジェクトで操作が実行されるたびに、実際の作業を行う実装オブジェクトに転送されます。
このアプローチの利点は、これらのオブジェクトのコピーと破棄が低コストであることです。オブジェクトのコピーを作成するには、ラッパーの新しいインスタンスを作成し、そのポインターを実装オブジェクトを指すように設定してから、オブジェクトへのポインターの数をインクリメントします (これは参照カウントと呼ばれることもあります。ところで)。破壊も同様です。参照カウントを 1 つ減らしてから、他の誰かが実装を指しているかどうかを確認します。そうでない場合は、そのリソースを解放します。それ以外の場合は、何もせず、他の誰かが後でクリーンアップを行うと想定します。
このアプローチの課題は、複数の異なるオブジェクトがすべて同じ実装を指していることを意味することです。これは、誰かが実装に変更を加えると、その実装を参照するすべてのオブジェクトに変更が反映されることを意味します。これは非常に深刻な問題です。これを修正するために、実装を変更する可能性のある操作が実行されるたびに、操作は、参照カウントが同じ 1 であるかどうかを確認することによって、他のオブジェクトも実装を参照しているかどうかを確認します。他のオブジェクトがそのオブジェクトを参照していない場合、操作は続行できます。変更が伝播する可能性はありません。データを参照する他のオブジェクトが少なくとも 1 つある場合、ラッパーはまず自身の実装のディープ コピーを作成し、そのポインターを新しいオブジェクトを指すように変更します。
この例を実際に見てみたい場合は、スタンフォード大学の入門 C++ プログラミング コースの講義例 15.0 と 16.0 を参照してください。この手法を使用して、単語のリストを保持するオブジェクトを設計する方法を示します。
お役に立てれば!