From: arton Date: 2008-09-12T01:37:54+09:00 Subject: [ruby-list:45497] Re: _Re:_volatileの付け方 この質問についての回答がつかないようなので。 > ポインタに対して、 > > p_foo = (VALUE *)ALLOC_N(VALUE, len); > > p_foo[0] = rb_class_new_instance(...); > p_foo[1] = rb_class_new_instance(...); xmallocしたのはヒープなので自分でマークしなければだめだと思いました(う む、自信ないや)。 したがって、rubikitchさんが書かれた方法を兼用して、 volatile VALUE* pary = rb_ary_new... のようにすれば、スタック上(GCによって有効と判断される)のVALUE*に配列が 確保できるので安全です。ここで、volatileを付けないと最適化によっては、そ のコードの位置でスタックに積まれないのでGCされてしまう可能性があるのは、 ご想像の通りです。 ただ、誤解していたら申し訳ありませんが、次のようにしたほうが高速で、かつ 簡単という可能性はありませんか? 1. Rubyから拡張ライブラリが呼ばれる(引数はArrayなのかな?) 2. 普通にCのプログラムとして配列を作って(int配列かdouble配列かはわかり ませんが)、その配列に、Rubyから渡されたものをコピー(VALUEからintなどへ の変換は必要ですが)する。(引数はスタックに積まれるので問題なし) 普通にCのプログラムで計算する。(ここに時間がかかるのだと想定しています) 3. 計算が終わったら、Ruby用にVALUEへ変換しながら書き戻す。 数日計算するほどの量だと、仮にFIXNUMだとしても、Cで計算可能な型に直すに はビット演算(doubleだと関数呼び出し)が必要となるため、Cで書いてもそれ ほど効果があるかは疑問です。つまり、Cの中ではあまりVALUEを利用しないです ませるほうが、GCを気にしなくても構わないし、処理も高速だと思います。 -------------------------------------- Enjoy MLB with MAJOR.JP! Ichiro, Matsuzaka, Matsui, and more! http://pr.mail.yahoo.co.jp/mlb/