リージョン
region
GCに比べて早期にオブジェクトの解放ができる
メモリのヒープ領域をリージョンという抽象化された領域に分割する オブジェクトをリージョンの中に割り付けて、
リージョンの中のオブジェクトがすべて不要になったら、
リージョンをまるごと回収する
メモリの確保・解放をリージョン毎に行う
リージョンを開始するときにそれ用のメモリを用意する
リージョンが終わったタイミングで回収する
ブロック文と同じノリ
リージョンは入れ子ができる
関数では返り値をどのリージョンに置くのかをGenericsっぽく指定したりする
code:ml
letlec appendr1 p = -- ここで指定する let (xs, ys) = p
in case xs of
nil => ys
| x::xs' => (x::letregion r2 in
(appendr1 ((xs', ys) at r2)) end at r1)
end
end
リージョンとブロック文の違い
リージョンには名前をつける
メモリ割り当て時にどのリージョンに置くのかを指定する
リージョンは型で表現される
普通の型intなどを拡張して(int, r)のような型に拡張する
ここでrはその値を格納するリージョンを表す
関数の型はこんな感じになる
((int, r1)->(int, r2), r3)
「r1に格納された整数を引数にとり、r2に格納された値を返す」というr3に格納された関数
リージョンの原点?
参考