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

31 lines
2.4 KiB
Markdown

# オブジェクトの種別
オブジェクトには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で管理され、オブジェクトが改変されると使えなくなる。