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ěť proT+ 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ů.