[Anthy-dev 2353] ScmObjInternalのCompacting

Back to archive index

Kazuki Ohta mover****@hct*****
2005年 9月 4日 (日) 08:34:19 JST


太田です。

そろそろ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つの方法です。

1. mark_tableの作成
gcデータ(mark or unmarked)用に独自のテーブルを持ちます。1ビットの情報しか
いらないので、int mark_table[HEAP_SIZE / 32]とする事でスペースを削減でき
ます。mark_tableのインデックスは対応するheap上のScmObjInternalのインデック
スと対応します。

こうして、Aにgcデータを確保する必要が無くなったので、ABXYを型情報に使用
する事が出来ます。

2. 型毎にヒープを分ける
すべてのヒープの開始アドレスと終端アドレスをチェックして、ここのヒープに含まれて
いるから、このデータ型だという様に判断する。もの凄く遅そうなので、あまり現実的
では無いかも。

なので1の方式を採用しようかと思っているのですが、どうでしょう?

-------------------------------------------------
Kazuki Ohta : mover****@hct*****
-------------------------------------------------


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