まつもと ゆきひろです
In message "[ruby-list:10073] Re: ruby:struct -> ext module -> ruby"
on 98/10/14, "Kikutani, Makoto" <kikutani / sprintmail.com> writes:
|きくたにです。またこれなんですが、
|q = (char *) NUM2INT(p);
|
|のようにして受けます。このとき、qが最初のlineを指していること
|が保証できるでしょうか?
できないですね.ちょっと考えただけでもふたつの点でまずいです.
* 64ビットマシンではポインタサイズはintのサイズより大きい
* FIXNUMは1bitフラグに使っているのでポインタよりも1bitサイ
ズが小さい
しかし,前者はruby自身がlongとポインタサイズが等しいことを期
待してますから,rubyが動いてるマシンなら,longに変換すれば大
丈夫そうな気がします.LONG2NUM()やNUM2LONG()を使って下さいま
せ.
後者はFIX系ではなくNUM系を使っているので問題ないか.でも,
ruby自身がポインタが偶数アドレスにアラインされていることを期
待しているので,こうした方が効率良いかも知れません.
return (VALUE)(((long)line) | FIXNUM_FLAG);
q = (char*)(p & ~FIXNUM_FLAG);
もちろん,完全な移植性は保証されなくなります.が,実用上は十
分かな.もっともこのようなことを行わない方法があればそっちの
方が望ましいように思います.
まつもと ゆきひろ /:|)