6

使用中のオブジェクトの時期尚早なガベージ コレクションを回避するために、Ruby 拡張機能でVALUEasを宣言することが適切な場合についてのドキュメントはあまり見つかりません。volatile

これが私がこれまでに学んだことです。空欄を埋められる人はいますか?

を使用する必要がないvolatile場合:

  • C++ オブジェクト メンバー内 (スタック上にないため? )
  • Ruby API を呼び出さない C/C++ メソッド内 ( Ruby API が呼び出されるまで GC がオンにならないため)

いつ使用する必要がありますvolatile

  • ALLOCRubyまたはmallocマクロ/関数のいずれかを呼び出す C/C++ メソッド内(これらは、メモリが高度に断片化されている場合に GC をトリガーする可能性があるため)
  • Ruby 関数を呼び出す C/C++ メソッド (例: rb_funcallrb_ary_newなど)

GC を回避するその他の方法

  • VALUE使用中のマーク
  • オブジェクトの作成中に GC を無効にしてから再度有効にする
  • Ruby の割り当て方法を使用しない (危険)

すべて正しいですか?不足している詳細は何ですか? マーキング以外にvolatile方法はありますか?

4

2 に答える 2

0

変数を としてマークするとvolatile、C/C++ コンパイラが特定の最適化を適用できなくなります。これは、変数が「独自に」値を変更できないという前提に基づいています。ウィキペディア: 揮発性変数

VALUEaが C 拡張以外の Ruby コードと共有されているか、変更できる場合に使用して、コンパイラにこの事実を認識させる必要があると思います。この例を見てください。

于 2013-10-12T11:33:20.117 に答える