2011-07-21 7 views
8

Boehm GCを正確なモードで使用しているMonoのWebページを読んだことがあります。私もBoehm GCをC++で使用していますが、ドキュメントやヘッダーには正確なモードを示すものはなく、それを有効にする方法はほとんどありませんでした。Boehmガベージコレクタの正確なモード

デフォルトで実際に正確なモードが設定されているかどうか、またそれをオンにする方法に関する情報、またはMono開発者による変更の一部でしたか?

+1

正確なモードでは、ポインタがどこに格納されているかを正確に示すために、コンパイラからのサポートが必要と考えています。 CおよびC++での型キャスティングは、これを不可能にします。 –

+0

だから私は聞いたことがある。しかし、私はそれが透明な方法で可能にするいくつかのコンパイラ/プラットフォーム固有のソリューションを含むかもしれないと思った。 – Frigo

答えて

4

ガベージコレクタ(archive here)からファイルDOC/gcinterface.html状態:

ボイド* GC_MALLOC_ATOMIC(size_tのnバイト) をストレージのnバイトを割り当て。 nbytesに比例して(償却された)時間が 必要です。参照されていない場合、結果のオブジェクトは自動的に に割り当てられません。クライアントは、結果の オブジェクトに決してポインタが含まれないことを約束します。メモリはクリアされません。 これは、文字列、浮動小数点配列、 ビットマップなどを割り当てるのに適した方法です。 ディストリビューションのgc_typed.hのインターフェイスを使用して、ポインタの位置に関するより正確な情報を に送信することができます。

"正確な"インターフェイスが使用できるようです。

+0

私はそれが、このような単純な構造を「正確」と呼ぶのは遠いものだと信じています。ポインタや他のものが混在している場合は解決されません。 – Frigo

+0

さて、私はこれを答えとして受け入れるつもりです。 Boehmでは満足できる正確なモードはないようですが、GC_MALLOC_ATOMICまたはそのC++の同等の演算子new [](size、PointerFreeGC)は問題を多少緩和します。後者は配列、配列などの後者を使用します。 – Frigo

+0

@Frigo Boehmには、C++で使用できる正確なモード(Monoが正確です)があります。私の答えを見てください。 –

0

正確なモードでは、ポインタがどこに格納されているかを正確に示すために、コンパイラのサポートが必要であると思います。 CおよびC++での型キャスティングは、これを不可能にします。

管理言語が組み込まれているため、これは非常に簡単になります。

3

Boehm GCのMonoでの正確なモードは、単にGC_MALLOC_ATOMICではありません。基本型の配列の場合にのみ当てはまります。

管理タイプの場合は、GC_gcj_mallocが使用されます。 Monoのコンパイラは、すべてのマネージ型のオブジェクト記述子を生成し、引数のサイズがGC_gcj_mallocで、マネージ型の記述子を指すポインタを単純に呼び出します。次に、Boehm GCは、マークフェーズ中にディスクリプタを参照して管理対象のトレースをトレースします。

ローポインタがスタック上に生のポインタとして置かれてしまうことになります(GC_gcj_mallocはvoid *を返すので、スタックに何らかの種類のスタック記述子を介してポインタがどこにあるのかGCに伝える方法はありません) GC収集)。これが、Mono(SGen以前)がスタックを保守的なモードでスキャンする理由である。

これをC++で実装したい場合は、C++コンパイラを使用してオブジェクト記述子を生成するだけでは不十分です。私が長年前に想像していたのは、マネージクラスとしてマークされたクラス定義(例えば、_ref class MyManagedObjectの場合_refは何もない場合は#define)にあるすべてのC++ヘッダーファイルを解析し、記述子。その後、GC_make_descriptorGC_malloc_explicitly_typed関数を使用して、C++コンパイラのvtableの割り当て方法を制御できないため、オブジェクトをGC_gcj_mallocではなく正確なモードで割り当てることができます。

*編集:Managed C++ for GCC (open source GPL v3)を参照してください。

関連する問題