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