リージョン
region
GCに比べて早期にオブジェクトの解放ができる
メモリの
ヒープ領域をリージョンという抽象化された領域に分割する
オブジェクトをリージョンの中に割り付けて、
リージョンの中のオブジェクトがすべて不要になったら、
リージョンをまるごと回収する
メモリの確保・解放をリージョン毎に行う
リージョンを開始するときにそれ用のメモリを用意する
リージョンが終わったタイミングで回収する
ブロック文と同じノリ
リージョンは入れ子ができる
関数では返り値をどのリージョンに置くのかをGenericsっぽく指定したりする
mlletlec 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
に格納された関数
リージョンの原点?
参考