ヒープ割り当ては、 割り当てられたメモリーの割り当て解除を任意の順序でサポートします。 ディクショナリーの割り当ては影響を受けません(つまり、 連続領域(contiguous region)は終了しません)。 Gforth では、 これらのワードは標準の C 言語ライブラリー呼び出しである malloc() や free() や realloc() を使用して実装されます。
allocate
または resize
の 1 回の呼び出しによって生成されるメモリ領域は、 内部的に連続しています。
このような領域と他の領域(ヒープから割り当てられた他の領域を含む)との間には連続性はありません。
allocate
( u – a-addr wior ) memory “allocate”
連続したデータ空間を u アドレス単位分割り当てます。 データ空間の初期内容は未定義です。 割り当てが成功した場合、 a-addr は割り当てられた領域の開始アドレスで、 wior は 0 になります。 割り当てが失敗した場合、 a-addr は未定義で、 wior ゼロ以外の I/O 結果コードです。
free
( a-addr – wior ) memory “free”
a-addr で始まるデータ空間の領域をシステムに返します。 領域は元々 allocate
または resize
を使用して取得されている必要があります。 操作が成功した場合、 wior は 0 になります。 操作が失敗した場合、 wior
はゼロ以外の I/O 結果コードになります。
resize
( a-addr1 u – a-addr2 wior ) memory “resize”
a-addr1 に割り当てられた領域のサイズを u アドレス単位に変更します。 但し内容を別の領域に移動する可能性があります。
a-addr2 は、 結果の領域のアドレスです。 操作が成功した場合、 wior は 0 になります。 操作が失敗した場合、
wior はゼロ以外の I/O 結果コードになります。 a-addr1 が 0 の場合、 Gforth の (非標準の )
resize
は u アドレス単位の割り当てを行います。
以下のワード達はメモリー・ブロックを扱うのに役立ちます:
save-mem
( addr1 u – addr2 u ) gforth-0.2 “save-mem”
指定のメモリー・ブロックをヒープ内で新しく割り当てられた領域にコピーします。
free-mem-var
( addr – ) gforth-experimental “free-mem-var”
addr は、 メモリー範囲のアドレスとサイズを含む 2variable のアドレスです。 これはメモリーを解放し、 2variable をクリアします。
extend-mem
( addr1 u1 u – addr addr2 u2 ) gforth-experimental “extend-mem”
u (アドレス単位)によってヒープから割り当てられたメモリー・ブロック addr1 u1 を拡張します。 (おそらく再割り当てされた)開始アドレスは addr2 で、 その合計長さは u2 で、 拡張部分の開始アドレスは addr です(訳注: 例えば元々長さ10のブロックを5拡張すると( addr1 10 5 – addr2+10 addr2 10+5))
$tring ワード群は、 メモリー・ブロックの処理にも使用できます。 See $tring words (訳注: $tring (ダラー tring)と String (エス string) とあることに注意)
拡張可能なメモリー・バッファーの場合は、 $trings または以下のワード群を使用できます。 adjust-buffer
で管理されるバッファーに割り当てられたメモリーは縮小できないため、
これまでに確認された最大サイズよりも小さいサイズにバッファーを調整(adjust)するときはヒープ管理のオーバーヘッドは発生しません。
buffer%
( – u1 u2 ) gforth-experimental “buffer%”
u1 は アライメント(alignment)、 u2 は バッファー・デスクリプタのサイズです。
init-buffer
( addr – ) gforth-experimental “init-buffer”
adjust-buffer
( u addr – ) gforth-experimental “adjust-buffer”
addr の buffer% を長さ u に調整します。 これにより、 割り当てられた領域が拡大する可能性がありますが、 決して縮小されることはありません。
2@
を使用すると、 このようなバッファーの現在のアドレスと長さを取得できます。
典型的な使い方:
create mybuf buffer% %size allot mybuf init-buffer s" frobnicate" mybuf adjust-buffer mybuf 2@ move mybuf 2@ type s" foo" mybuf adjust-buffer mybuf 2@ move mybuf 2@ type