mirror of
https://github.com/erg-lang/erg.git
synced 2025-10-01 13:11:11 +00:00
31 lines
2.4 KiB
Markdown
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で管理され、オブジェクトが改変されると使えなくなる。
|