以下は、このトピックに関する現在入手可能な知識から導き出された一連の結論であり、本質的に問題は、これが正しいかどうか、そうでない場合、これらの結論に対する適切な修正は何かということです.
経験豊富な .net 開発者として、私は完全に、すべてのオブジェクト インスタンスがクラウド内のほとんど粒子として存在し、オブジェクト メンバーシップは単にそれらの粒子を相互に関連付けるという考えに完全に慣れています。フレームワーク内のルート オブジェクトへの何らかの参照によってパーティクルまたはパーティクル クラウドをリンクできない場合、それまたはそのメンバーは破棄されます。これは基本的に、参照カウントと、オブジェクトがまだルートへのパスを持っているかどうかの理解を維持するある種のネットワーク分析の結果です。
この構造では、オブジェクトの識別可能なインスタンスを他の多くのオブジェクトから参照 (「所有」) することができ、所有権のネットワークを必要に応じて複雑かつ循環/自己参照にすることができます。
C++ への移行では、メモリ管理のためにこの自由を制限する必要があることがわかります。すべてのオブジェクトには、オブジェクトの有効期間が親によって維持される明確な所有権ツリーが必要です。
ライフタイムは、波括弧で囲まれたコード セクション {} 内の一時的な値のように、スコープによって制約される場合もあります。絶対に避けるべきですが、new
キーワードを使用し、delete
C++ の新しい標準化では、shared_ptr のようなものは、.net マネージ メモリ モデルに近いものを許可するように設計されているようです。これらが、自己参照的ではあるが接続されていないオブジェクト クラウドを破棄するマネージド メモリと同じ利点を提供するかどうかはわかりません。
例は std::list です。私が知る限り、推奨される戦略は、リスト内のオブジェクト インスタンスは、shared_ptr コンストラクトの利点なしで、リストによってのみ所有され、リスト自体の有効期間によって決定される有効期間を持つ必要があるということです。これにより、一時的に呼び出されるコピー コンストラクター、デストラクタ、または単一の具象型を持つリストを必要とする emplace メソッドの使用が必要になります。別の解決策として、オブジェクトへのポインターを格納し、オブジェクトの有効期間を別の場所で管理する必要がありますが、これには明らかな危険が伴います。これはすべて非常に厄介なようです。
.net では、オブジェクトの有効期間が別の方法で管理されるため、リストは親またはガーディアンでなくてもオブジェクトを参照できます。
パフォーマンスに影響を与えるヒープメモリとスタックメモリには違いがあることは知っていますが、このトピックについて詳しくは知りません。
2 つのシステムに対する私の見方は本質的に正しいですか? そうでない場合、どのような修正を提供できますか? それが本質的に正しい場合、大規模で強力で高性能なアプリケーションを作成するために採用する必要がある C++ のメンタル モデルについて説明している文献はありますか? これには、コードのベスト プラクティスと、大規模なアプリケーションを確実に管理するというより抽象的な概念が含まれます。