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


6.7.3 Heap allocation

ヒープ割り当ては、 割り当てられたメモリの割り当て解除を任意の順序でサポートします。 ディクショナリの割り当ては影響を受けません(つまり、 連続領域(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 の (非標準の ) resizeu アドレス単位の割り当てを行います。

以下のワード達はメモリ・ブロックを扱うのに役立ちます:

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

Next: Memory Access, Previous: Dictionary allocation, Up: Memory   [Contents][Index]