使用中のオブジェクトの時期尚早なガベージ コレクションを回避するために、Ruby 拡張機能でVALUE
asを宣言することが適切な場合についてのドキュメントはあまり見つかりません。volatile
これが私がこれまでに学んだことです。空欄を埋められる人はいますか?
を使用する必要がないvolatile
場合:
- C++ オブジェクト メンバー内 (スタック上にないため? )
- Ruby API を呼び出さない C/C++ メソッド内 ( Ruby API が呼び出されるまで GC がオンにならないため)
いつ使用する必要がありますvolatile
か
ALLOC
Rubyまたはmalloc
マクロ/関数のいずれかを呼び出す C/C++ メソッド内(これらは、メモリが高度に断片化されている場合に GC をトリガーする可能性があるため)- Ruby 関数を呼び出す C/C++ メソッド (例:
rb_funcall
、rb_ary_new
など)
GC を回避するその他の方法
VALUE
使用中のマーク- オブジェクトの作成中に GC を無効にしてから再度有効にする
- Ruby の割り当て方法を使用しない (危険)
すべて正しいですか?不足している詳細は何ですか? マーキング以外にvolatile
方法はありますか?