まつもと ゆきひろです

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);

もちろん,完全な移植性は保証されなくなります.が,実用上は十
分かな.もっともこのようなことを行わない方法があればそっちの
方が望ましいように思います.
                                まつもと ゆきひろ /:|)