Next: , Previous: , Up: Memory   [Contents][Index]


6.7.2 Dictionary allocation

ディクショナリの割り当てはスタック指向の割り当てスキーム(stack-oriented allocation scheme)です。 つまり、 X の割り当てを解除したい場合は、 X の後に割り当てられたすべての割り当ても解除します。

以下のワード達を使用した割り当ては連続しており、 アドレスの増加方向に向けて領域が拡張されます。 あらゆる種類のディクショナリ・メモリを割り当てる他のワード(つまり、 :noname を含む定義ワード)は、 連続領域(contiguous region)を終了し、 新しい領域を開始します。

標準 Forth では、 create されたワードのみが、 後続の連続領域の開始となるアドレスを生成することが保証されています。 特に、 variable によって割り当てられたセルが、 後続の allot で割り当てられたメモリと連続していることは保証されません。

allot に負の引数を指定して使用すると、 メモリの割り当てを解除できます(いくつかの制限があります。 allot を参照してください)。 大規模な割り当て解除の場合は、 marker を使用します。

here ( – addr  ) core “here”

データ空間内の次の空き位置のアドレスを返します。

unused ( – u  ) core-ext “unused”

here でアドレス指定された領域(以降)に残っている空き領域の量をアドレス単位(address units)で返します。

allot ( n –  ) core “allot”

初期化せずに、 データ空間に n アドレス単位を予約します。 n は符号付きの数値で、 負の n を渡すとメモリが解放されます。 ANS Forth では、この方法で現在の連続領域からメモリの割り当てを解除することしかできません。 Gforth では、この方法で名前付きワード以外のあらゆるものを割り当て解除できます。 システムはこの制限をチェックしません。

->here ( addr –  ) gforth-1.0 “to-here”

here の値を addr に変更します。

c, ( c –  ) core “c-comma”

文字(char)用に1つのデータ空間を予約し、 その空間に c を格納します。

f, ( f –  ) gforth-0.2 “f,”

浮動小数点数(floating-point number)用の1つのデータ空間を予約し、 その空間に f を格納します。

, ( w –  ) core “comma”

セル(cell)用の1つのデータ空間を予約し、 その空間に w を格納します。

2, ( w1 w2 –  ) gforth-0.2 “2,”

2つのセル用のデータ空間を予約し、 そこに w1 w2 格納します。 最初(低位アドレス側)に w2 を格納します。

w, ( w –  ) gforth-1.0 “w-comma”
l, ( l –  ) gforth-1.0 “l-comma”
x, ( x –  ) gforth-1.0 “x-comma”
xd, ( xd –  ) gforth-1.0 “x-d-comma”
A, ( addr –  ) gforth-0.2 “A,”

1 つのセル用のデータ空間を予約し、 そこに addr を格納します。 私達のクロス・コンパイラの場合には、 再配置可能なイメージに必要な型情報(type information)を提供します。 ただし、 通常では、 これは , と同等です。

mem, ( addr u –  ) gforth-0.6 “mem,”

save-mem-dict ( addr1 u – addr2 u ) \ 訳注:文字列をhereからのディクショナリに書き込み、その(ディクショナリ上の)文字列を返します

メモリ・アクセスはアライメントする必要があります(see Address arithmetic)。 したがって、 メモリ割り当てもアライメントされるべきです。 つまり、 セルを割り当てる前に、 here をセル・アライメントする必要があります。 以下のワード達は、 here が既に指定の型のアライメントに合っている状態で無い場合は合わせます。 基本的に、 既に割り当てたのがその型のサイズの倍数であり、 かつ、 here が以前にその型のアライメントに対して合うようにしてあった場合にのみ、 その型のアライメントに対して既にすでに合っているということが言えます。

新しくワードを create した後、here は 標準 Forth では align されます(Gforth では maxalign されます)。

align ( ) core “align”

データ空間ポインタがアライメントできてない場合は、 アライメントするのに十分な空間を予約します。

falign ( ) floating “f-align”

データ空間ポインタが浮動小数点数にアライメントされていない場合は、 アライメントするのに十分な空間を予約します。

sfalign ( ) floating-ext “s-f-align”

データ空間ポインタが単精度浮動小数点数にアライメントされていない場合は、 アライメントするのに十分な空間を予約します。

dfalign ( ) floating-ext “d-f-align”

データ空間ポインタが倍精度浮動小数点数にアライメントされていない場合は、 アライメントするのに十分な空間を予約します。

maxalign ( ) gforth-0.2 “maxalign”

すべてのアライメント要件に合わせてデータ空間ポインタをアライメントします。

cfalign ( ) gforth-0.2 “cfalign”

データ空間ポインタをコード・フィールドの要件に合わせてアライメントします(つまり、 対応する本体が maxalign された状態になるようにする)。


Next: Heap allocation, Previous: Memory model, Up: Memory   [Contents][Index]