ディクショナリーの割り当てはスタック指向の割り当てスキーム(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 された状態になるようにする)。