[Anthy-dev 2353] ScmObjInternalのCompacting

Back to archive index

Yuichi Yoshida oxy****@kmc*****
2005年 9月 4日 (日) 13:53:32 JST


吉田です。
SigSchemeの開発お疲れさまです。

>> 太田です。
>> 
>> そろそろScmObjInternalを8byteに圧縮してしまおうかと思います。
>> ただ、少し悩んでいる所が有るので投げてみます。
>> 
>> まず方針として基本的に、下位3bitをオブジェクト情報に割り当てます。
>> 32bitマシンの場合はこんな感じですかね。(以下話は32bitマシン上の話としています)
>> 
>> ScmObjInternal *obj;
>> ScmObjInternal*: [ -- 29 bit -- ] [ABC] (car部)
>> ScmObjInternal*: [ -- 29 bit -- ] [XYZ] (cdr部)
>> 
>> 王道ですが、最下位ビット(C と Z)が立っている時は即値と見なします。
>> [-- 29bit --][001]や[-- 29bit --][101]等の値は全て即値と見なされます。
>> 逆に、即値でない場合は次のようになります。
>> 
>> 後残っているのはA,B,X,Yの部分です。ここにgcのデータ(marked or unmarked)
>> とScmObjの型情報(Cons? String? Port?)が入ります。まずAにgc用のデータを
>> 割り当てたとして、残りB,X,Yの部分に型情報を詰め込む必要が有ります。
>> 
>> しかし現在 ScmObjType は15種類有って、少なくとも4bit必要です。どう考えて
>> も足りませんね...これを解決する為に僕が思い付いたのは、次の2つの方法です。

ソースを追いかけているわけではないので、検討外れのことを聞くかもしれませんが、
この場合の即値というのは29bitの部分がそれぞれ別の即値という意味なのか
(つまりScmObjInternalは二つまでの即値を格納することができる)、
ScmObjInternal全体で一つの即値という意味なのかどちらでしょう。
もし、ScmObjInternal全体で一つの即値なら
C=gcのmark、Z=即値フラグ、ABXY=型とすれば4bit確保できるなぁと思ったのですが。

もし二つ即値を格納できるようにしたとしても、
数値のリストではなくて、ただの数値単体の場合はやっぱり8byte必要なので、
それほどメリットは大きくないかなぁと思います。
# もちろんプロファイルしないと断定はできませんが


----
吉田 悠一
oxy****@kmc*****
http://mono.kmc.gr.jp/~oxy/



Anthy-dev メーリングリストの案内
Back to archive index