erg/doc/JA/compiler/memory_management.md
Shunsuke Shibayama 96132b20f6 initial commit
2022-08-10 23:02:27 +09:00

2.4 KiB

オブジェクトの種別

オブジェクトにはSize, Mutabilityの2つの属性がある。

Size(Small/Big/Unsized)

比較的小さいサイズのオブジェクトは「Small」と呼ばれる。小さいとみなされるサイズはプラットフォーム依存である。 これに該当するオブジェクトは基本的にスタックで管理される。複製(duplication)は値ごとする(Light clone)ので、参照カウントは行われない。 ただしスタックの80%以上が消費された場合は、ヒープ管理に移行する。

比較的大きいサイズのオブジェクトは「Big」と呼ばれる。これに該当するオブジェクトはヒープで管理される。 複製は大抵RCで管理される(copy)。

(実行時)可変サイズのオブジェクトは「Unsized」と呼ばれる。対してSmall/Bigは「Sized」と呼ばれる。 可変オブジェクトだから全てUnsizedとは限らない。長さが10で中身を書き換えられる可変配列([T; !N])はMut Sizedオブジェクトである。 不変オブジェクトは全てSizedとなる。当たり前のようにも聞こえるが、多くの言語においてスライス―配列の部分(不変)参照)―はUnsizedとなっている。 逆にUnsizedオブジェクトは可変なので、全てヒープで管理される。コピー(.frozenで生成する)はオリジナルが破壊的に変更されると使用不可になる。完全な複製はクローンで行う。

Mutability(Immut/Mut)

不変オブジェクトは「Immut」と呼ばれる。これに該当するオブジェクトはLight duplicationまたはコピーができる。コピーは実体を1つだけ持つ。 可変オブジェクトは「Mut」と呼ばれる。これに該当するオブジェクトはコピーができないので、複製したいときはHeavy duplication = cloneを使う。 cloneは内容が同じオブジェクトを1から作り直すので、コピーより低速である。

.dupの詳細

.dupはその時によって最適なアルゴリズムが選択される。 不変オブジェクトに対しては大抵の場合RCを使う。可変オブジェクトにはcloneを使う。

可変オブジェクトを.dupすると可変オブジェクトが作られるが、不変オブジェクトが欲しい場合は.frozenを使う。 これはRCで管理され、オブジェクトが改変されると使えなくなる。