Sobes.tech
Middle+

Jak jsou volitelné hodnoty uloženy v paměti?

sobes.tech AI

Odpověď od AI

Volitelný v Swiftu představuje výčet se dvěma případy: .none (nebo nil) a .some(Wrapped).

enum Optional<Wrapped> {
    case none
    case some(Wrapped)
}

Když volitelný obsahuje hodnotu (.some(Wrapped)), ukládá samotnou hodnotu typu Wrapped plus další bit, který indikuje přítomnost hodnoty. Pokud je volitelný nil (.none), uložen je pouze tento bit nebo speciální vzor bytů, který indikuje absenci hodnoty.

Způsob ukládání se může lišit v závislosti na typu Wrapped a architektuře procesoru (32bit vs 64bit), ale obecná myšlenka je použití indikátoru přítomnosti hodnoty. U referenčních typů může být nil reprezentován nulovým ukazatelem, pokud není potřeba samostatný indikátor nebo je sloučen s ním. U hodnotových typů je potřeba další místo pro indikátor.

Příklad s 64bitovou architekturou a indikátorem:

  • Pokud Optional<T> obsahuje hodnotu: paměť pro T + 1 bit (nebo bajt) pro indikátor "je hodnota".
  • Pokud je Optional<T> nil: obvykle se uloží speciální vzor bytů nebo se sloučí s ukazatelem u referenčních typů.

Je důležité poznamenat, že pro typy, jejichž velikost je menší než jejich přirozené zarovnání (například Bool na 64bitovém systému), může být indikátor přítomnosti "integrován" do zbývajících bitů, čímž se šetří paměť. Tato optimalizace se nazývá "Nullable Pointer Optimization" pro referenční typy a je podobná u některých hodnotových typů.