C++で利用できる無料の商用ガベージコレクションライブラリは何ですか?それぞれの長所と短所は何ですか?
私は、マーケティングや宣伝文句ではなく、現場で実際に使用して得た教訓に興味があります。
自動ガベージコレクションに関連する通常のトレードオフについて詳しく説明する必要はありませんが、使用されるアルゴリズム(参照カウント、マークアンドスイープ、インクリメンタルなど)に言及し、結果を簡単に要約してください。
私は過去に Boehmコレクター を使用して成功しています。オープンソースであり、商用ソフトウェアで使用できます。
これは保守的なコレクターであり、ガベージコレクションテクノロジーの第一人者によって開発された長い歴史があります。
Boostには幅広い範囲の スマートポインター があり、参照カウント、スコープからの削除、または侵入参照リファレンスを意味します。これらは私たちのニーズを十分に証明しています。大きなプラスは、それがすべて無料のオープンソースでテンプレート化されたC++であることです。これは参照カウントであるため、ほとんどの場合、オブジェクトが破壊されたときに非常に確定的です。
私はboehm-gcをよく使っています。使い方は簡単ですが、ドキュメントは非常に貧弱です。 C++ページがありますが、見つけるのは非常に困難です。
基本的には、すべてのクラスがその基本クラスから継承し、常にgc_allocatorをコンテナに渡すことを確認します。 libgccppを使用して、newおよびdeleteの他の用途をキャッチしたい場合がいくつかあります。これらは主に高レベルの変更であり、#ifdefを使用してコンパイル時にGCをオフにでき、これをサポートすると1つまたは2つのファイルにのみ影響することがわかります。
私の主な問題は、最初にコレクターをオフにしない限り、Valgrindを使用できなくなることです。コレクターをオフにすることは簡単で、再コンパイルする必要はありませんが、メモリー不足になり始めた場合は、コレクターを使用することは明らかに不可能です。
Boehmガベージコレクター は自由に利用でき、おそらくかなり良い(自分自身を直接経験することはありません)
([PDF警告] Boehmガベージコレクターのための C++ 0x提案に関する理論的論文 )
もともとはC++ 0x を作成すると言われていましたが、結局は作成されません (時間の制約があるためと思います)。
Proprosal N2670 (ガベージコレクターの最小サポート)は2008年6月に承認されたため、コンパイラーの実装がこれを受け入れ、標準が完成しました。 C++のガベージコレクションの世界は必ず変化します...
C++でのGCの主な問題は、GCの意味で非協調的なモジュールを処理する必要があることです。つまり、GCを念頭に置いて記述されたことのないライブラリを処理するためです。
これが、Boehm GCがしばしば推奨される理由です。
私が知っているのはベームだけです。下部には伝統的なマークアンドスイープがあります。これはおそらくこれを最適化するためにさまざまな手法を使用しますが、通常、増分/世代別/圧縮GCは、.Net C++で取得できるものなどのマネージサブセットを使用しないと、C++用に作成するのは困難です。ポインターを移動する必要があるいくつかのアプローチは、ポインターの固定または読み取り/書き込みブロックのコンパイラーサポートを使用して実装できますが、パフォーマンスへの影響が大きすぎる可能性があり、GCへの重要な変更とは限りません。
これは私がこれと同じものを探しているときに見つけた市販の製品です
HnxGC http://hnxgc.harnixworld.com/
昔は、Geodesic SystemsのGreat Circleという製品もありましたが、もう販売していないようです。誰に販売されたかはわかりません。
MicrosoftのManaged C++を使用することもできます。 CLRとGCは非常に堅固でサーバー製品で使用されていますが、GCが実際に収集するにはCLRタイプを使用する必要があります。既存のコードを再コンパイルしてすべての削除ステートメントを削除することはできません。
私はC#を使用して新しいコードを記述したいのですが、マネージC++を使用すると、コードベースをさらに進歩的に進化させることができます。
this を読んで、結論をよく見てください。
結論
- 単純なソリューションが広く使用されており、C++ 0xによって改善される問題の複雑なソリューションで、ほとんど必要がありません。
- 標準化される推奨言語機能の経験はほとんどありません。
- 悪いソフトウェアの複雑なシステムを修正することは決してうまくいきません。
将来のGCサポートを改善するために言語のマイナーな変更をお勧めします-1つの例としてポインター(xorリストトリック)の非表示を許可しません。
最後に、「GCがないため、C++は悪い」という引数に正面から取り組みます。 C++はガベージを生成しないため、GCは必要ありません。明らかに、Java、C#、Objective Cなどが大量のゴミを生成します。
はい、最後の文は主観的であり、また聖戦の一部です。
誰かが私のためにゴミを出す必要があるという考えが嫌いなので、C++を使用しています。
市役所がそれを行い、それで十分です。
GCが必要な場合は、別の言語を使用してください。適切な仕事に適したツールを選択してください。