6

C++ では、不要になったオブジェクトを自動的に削除するためにboost::shared_ptrandを使用しています。boost::weak_ptrこれらは参照カウントで機能することを知っています。

Java では、メモリはガベージ コレクターによって管理されます。ガベージ コレクターは、組み込みのオブジェクト参照を strong 、 weak 、およびその中間のものと見なします( GCによって収集される可能性がありますが、GC を生き残ることもできます)。これは非常に便利です。しばらくの間オブジェクトをキャッシュしますが、空きメモリが少なくなるとすぐにオブジェクトを破棄します。WeakReferenceSoftReference

だから今、私は C++ に戻っており、ソフト参照を持つ快適さが恋しいです。参照カウントでソフト参照が実際に実行可能かどうか疑問に思います。オブジェクトへの最後の強参照がクリアされ、ソフト参照が残っている場合、それはいつ削除されるのでしょうか? いくつかの計画を思いつくことができましたが、どれも賢いとは思えません。

参照カウントに加えてソフト参照の適切なセマンティクスがある場合に備えて、これは既に実装されているのではないかと思います。おそらく互換性のある方法でboost::shared_ptr(または C++ TR1 に相当std::shared_ptrします)。

両方の質問に対する答えが「いいえ」の場合、オブジェクト キャッシング シナリオの代替手段は何ですか?

編集: もちろん、オブジェクトを構築するのにコストがかかるため(データベースへの複数のアクセスとネットワークのクエリを考えてください)、キャッシングが実際に役立つ状況について話していますが、それらをすべて永久に保持するには多すぎます。

4

5 に答える 5

7

他の人が指摘しているように、Boostライブラリで参照されたカウントされたポインター(およびそれに付随する弱い対応物)を見つけることができますが、ソフトリファレンスのアイデアに欠けているのは、ランタイム環境のメモリ制約の認識です。たとえば、Javaでは、aはその機能においてaと実質的にSoftReference違いはありません。WeakReferenceむしろ、それは、異なるメモリプレッシャーに直面して、ランタイムが2種類の参照をどのように保持または排除するかについての契約です。

C ++でこの動作を模倣するには、アプリケーションの他の部分が弱く保持するオブジェクトへの強力な参照を保持するメモリ対応の参照キャッシュを構築する必要があります。キャッシュが、アプリケーションがメモリ使用量の上限(またはその他の制約基準)をスクラッチしていると判断すると、強参照を解放し、オブジェクトを「収集」(参照カウントがゼロに達する)のために放棄し、使用中の弱参照を後で使用できるようにします。無効化を検出します。

于 2010-07-04T18:15:01.010 に答える
2

この動作を本当に再現したい場合は、ガベージ コレクター ( http://www.hpl.hp.com/personal/Hans_Boehm/gc/など) を使用して、オブジェクトまたはオブジェクトのサブセットを処理することができます。 SoftReferences を使用すると便利な場合があります。

しかし、Java の動作を複製するよりも C++ にネイティブなソリューションを選びたいと思いますが、それを止めるものは何もありません。

于 2010-07-05T00:39:46.227 に答える
1

独自の LRU キャッシュと、そのようなキャッシュに関連付けられた新しい smart_pointer を実装できます。そのような構造がBoostまたは標準C++に存在するとは思わない(とにかく私の頭のてっぺんから)。Web アプリケーションなどを実行している場合は、memcached への C インターフェイスである libmemcached を使用できます。

そのようなオブジェクトを構築/破棄するのに非常にコストがかかる状況を考えるのは難しいと思います... 再初期化するのは安価ですが... LRU キャッシュが役立つようになります。しかし、本当に必要な場合は、実際に構築するためのツールがあります。

于 2010-07-04T17:52:00.397 に答える
0

buffcacherなどを使用して、アプリケーション外のソフト参照データを OS に移動できます。

私はこれを提供するライブラリを知っていません。

非常に高速で公平であるため、従来のキャッシュではほとんど小さく見える Web サーバーやその他のタスクで「安全な Cookie」の検証をキャッシュするのに役立ちます。

于 2011-09-27T09:52:59.440 に答える
-2

いいえ、C++ にはそのようなものはありません。また、あるべきではありません。すべてのオブジェクトは重要な目的を果たします。そうでない場合、なぜまだ持っているのですか?このようにオブジェクトを保持すると、メモリ リークが発生します。オブジェクトが必要な場合は、それが必要です。そうでない場合は、それを破壊します。役に立つものと役に立たないものの間に中間はありません。

必死なら、独自のガベージ コレクタを作成し、そのようなものを自分で実装することは不可能ではありません。しかし、それらを必要としたり、まったく使用したりしないことをお勧めします。

編集: オブジェクトキャッシングでは、人々は通常 LRU キャッシュを使用します。キャッシュ ミスが発生すると、使用頻度の最も低いオブジェクトへの参照が破棄され (キャッシュがいっぱいの場合)、新しいオブジェクトが作成され、使用頻度の最も低いオブジェクトとして配置され、他のオブジェクトはすべて下に移動します。ただし、通常、C++ でキャッシュ戦略が実際に必要になる前に、ディスクからアイテムを取得する必要があります。ほとんどのオブジェクトを作成するコストは、それほど大きくありません。

于 2010-07-04T15:01:31.717 に答える