70

C++ で使用できる無料および商用のガベージ コレクション ライブラリと、それぞれの長所と短所を教えてください。

私は、マーケティングや宣伝文句ではなく、現場での実際の使用から苦労して得た教訓に興味があります.

自動ガベージ コレクションに関連する通常のトレードオフについて詳しく説明する必要はありませんが、使用されるアルゴリズム (参照カウント、マーク アンド スイープ、インクリメンタルなど) について言及し、その結果を簡単に要約してください。

4

9 に答える 9

31

私は過去にBoehm コレクターを使用して成功しました。オープンソースであり、商用ソフトウェアで使用できます。

これは保守的なコレクターであり、ガベージ コレクション テクノロジの第一人者の 1 人によって開発された長い歴史があります。

于 2008-09-17T08:26:43.180 に答える
23

Boost には、参照カウント、スコープ内削除、または侵入型参照カウントを実装する幅広いスマート ポインターがあります。これらは、私たちのニーズを満たすのに十分であることが証明されています。大きな利点は、すべて無料でオープン ソースのテンプレート化された C++ であることです。これは参照カウントであるため、ほとんどの場合、オブジェクトが破棄されるときは非常に決定論的です。

于 2008-09-17T09:41:44.437 に答える
10

私はboehm-gcをよく使います。使い方は簡単ですが、ドキュメントは本当に貧弱です。C ++ページがありますが、見つけるのは非常に困難です。

基本的には、すべてのクラスが基本クラスから継承していること、および常にgc_allocatorをコンテナーに渡すことを確認するだけです。多くの場合、libgccppを使用して、newおよびdeleteの他の使用法をキャッチする必要があります。これらは主に高レベルの変更であり、コンパイル時に#ifdefを使用してGCをオフにできることがわかりました。これをサポートすると、1つまたは2つのファイルにのみ影響します。

それに関する私の主な問題は、最初にコレクターをオフにしない限り、Valgrindを使用できなくなることです。コレクターをオフにするのは簡単で、再コンパイルする必要はありませんが、メモリが不足し始めた場合、コレクターを使用することは明らかに不可能です。

于 2009-07-29T14:10:40.460 に答える
10

Boehm ガベージ コレクターは無料で利用でき、かなり優れていると思われます (私自身は直接の経験はありません)。

Boehm ガベージ コレクタの C++0x 提案に関する理論論文 (PDF)

もともとは C++0x を作ると言われていましたが、結局作ることはありません(時間の制約のためだと思います)。

ただし、提案 N2670 (ガベージ コレクターの最小限のサポート) は 2008 年 6 月に承認されたので、コンパイラの実装がこれを取り上げ、標準が最終化されると、C++ のガベージ コレクションの世界は確実に変化します...

于 2008-09-17T08:26:31.573 に答える
2

私が知っているのは Boehm だけで、一番下にあるのは伝統的なマーク アンド スイープです。おそらくさまざまな手法を使用してこれを最適化しますが、通常、インクリメンタル/世代別/圧縮 GC は、.Net C++ で取得できるようなマネージド サブセットを使用せずに C++ 用に作成するのは困難です。ポインターを移動する必要があるいくつかのアプローチは、ポインターまたは読み取り/書き込みブロックを固定するためのコンパイラ サポートを使用して実装できますが、パフォーマンスへの影響が大きすぎる可能性があり、GC への重要な変更であるとは限りません。

于 2008-09-17T08:27:38.793 に答える
2

C++ での GC の主な問題は、GC の意味で非協調的なモジュールを処理する必要があることです。つまり、GC を念頭に置いて書かれたことのないライブラリを扱うためです。

これが、Boehm GC がしばしば推奨される理由です。

于 2009-03-10T05:08:27.823 に答える
1

Microsoft の Managed C++ を使用することもできます。CLR と GC は非常に堅実で、サーバー製品で使用されていますが、GC が実際に収集するには CLR 型を使用する必要があります。既存のコードを再コンパイルしてすべての削除ステートメントを削除することはできません。

私は C# を使用してまったく新しいコードを記述したいと考えていますが、Managed C++ を使用すると、コード ベースをより進歩的な方法で進化させることができます。

于 2009-06-12T14:35:21.753 に答える
1

これを読んで、結論をよく見てください。

結論

  • 単純な解決策が広く使用されており、C++0x によって改善される問題に対する複雑な解決策は、ほとんど必要ありません。

  • 標準化される推奨言語機能については、ほとんどまたはまったく経験がありません。

  • 悪いソフトウェアの複雑なシステムを修正してもうまくいきません。

  • 将来の GC サポートを改善するために、マイナーな言語変更を推奨します - 一例として、ポインター (xor リスト トリック) の非表示を禁止します。

  • 最後に、「C++ は GC がないため悪い」という引数に正面から対処します。C++ はガベージを生成しないため、 GC は必要ありません。明らかに、Java、C#、Objective C などは大量のガベージを生成します。

はい、最後の文は主観的であり、聖戦の一部でもあります.
私が C++ を使用しているのは、誰かが私のためにゴミを出す必要があるという考えが嫌いだからです。
市役所がそれをしてくれますし、私にはそれで十分です。
GC が必要な場合は、別の言語を使用してください。適切なジョブに適切なツールを選択してください。

于 2009-06-12T15:02:24.760 に答える