generated at
リージョン
region
GCと異なり、静的にメモリ管理をすることができる
GCに比べて早期にオブジェクトの解放ができる
参照カウントGCなどに比べれ実行時オーバーヘッドが小さい
メモリのヒープ領域をリージョンという抽象化された領域に分割する
オブジェクトをリージョンの中に割り付けて、
リージョンの中のオブジェクトがすべて不要になったら、
リージョンをまるごと回収する
メモリの確保・解放をリージョン毎に行う
リージョンを開始するときにそれ用のメモリを用意する
リージョンが終わったタイミングで回収する
ブロック文と同じノリ
リージョンは入れ子ができる
関数では返り値をどのリージョンに置くのかをGenericsっぽく指定したりする
コード例 ref
ml
letlec append[r1] p = -- ここで指定する let (xs, ys) = p in case xs of nil => ys | x::xs' => (x::letregion r2 in (append[r1] ((xs', ys) at r2)) end at r1) end end
この辺の推論を良い感じにするのがリージョン推論


リージョンとブロック文の違い
リージョンには名前をつける
メモリ割り当て時にどのリージョンに置くのかを指定する


リージョンは型で表現される
普通の型 int などを拡張して (int, r) のような型に拡張する
ここで r はその値を格納するリージョンを表す
関数の型はこんな感じになる
((int, r1)->(int, r2), r3)
r1 に格納された整数を引数にとり、 r2 に格納された値を返す」という r3 に格納された関数


リージョンの原点?






参考
Cycloneのドキュメント