Boehm GCを正確なモードで使用しているMonoのWebページを読んだことがあります。私もBoehm GCをC++で使用していますが、ドキュメントやヘッダーには正確なモードを示すものはなく、それを有効にする方法はほとんどありませんでした。Boehmガベージコレクタの正確なモード
デフォルトで実際に正確なモードが設定されているかどうか、またそれをオンにする方法に関する情報、またはMono開発者による変更の一部でしたか?
Boehm GCを正確なモードで使用しているMonoのWebページを読んだことがあります。私もBoehm GCをC++で使用していますが、ドキュメントやヘッダーには正確なモードを示すものはなく、それを有効にする方法はほとんどありませんでした。Boehmガベージコレクタの正確なモード
デフォルトで実際に正確なモードが設定されているかどうか、またそれをオンにする方法に関する情報、またはMono開発者による変更の一部でしたか?
ガベージコレクタ(archive here)からファイルDOC/gcinterface.html状態:
ボイド* GC_MALLOC_ATOMIC(size_tのnバイト) をストレージのnバイトを割り当て。 nbytesに比例して(償却された)時間が 必要です。参照されていない場合、結果のオブジェクトは自動的に に割り当てられません。クライアントは、結果の オブジェクトに決してポインタが含まれないことを約束します。メモリはクリアされません。 これは、文字列、浮動小数点配列、 ビットマップなどを割り当てるのに適した方法です。 ディストリビューションのgc_typed.hのインターフェイスを使用して、ポインタの位置に関するより正確な情報を に送信することができます。
"正確な"インターフェイスが使用できるようです。
正確なモードでは、ポインタがどこに格納されているかを正確に示すために、コンパイラのサポートが必要であると思います。 CおよびC++での型キャスティングは、これを不可能にします。
管理言語が組み込まれているため、これは非常に簡単になります。
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_descriptor
とGC_malloc_explicitly_typed
関数を使用して、C++コンパイラのvtableの割り当て方法を制御できないため、オブジェクトをGC_gcj_malloc
ではなく正確なモードで割り当てることができます。
*編集:Managed C++ for GCC (open source GPL v3)を参照してください。
正確なモードでは、ポインタがどこに格納されているかを正確に示すために、コンパイラからのサポートが必要と考えています。 CおよびC++での型キャスティングは、これを不可能にします。 –
だから私は聞いたことがある。しかし、私はそれが透明な方法で可能にするいくつかのコンパイラ/プラットフォーム固有のソリューションを含むかもしれないと思った。 – Frigo