Middle+
Jak je optional uložen v paměti ve Swiftu?
sobes.tech AI
Odpověď od AI
Volitelný v Swiftu se ukládá v paměti jedním ze dvou způsobů:
-
Pro typy, které nesplňují protokol
_ObjectiveCBridgeable: Reprezentace Malého/Velkého volitelného.- Malý volitelný: Pokud je velikost hodnoty menší nebo rovna velikosti ukazatele, přidá Optional jeden bajt k velikosti typu pro uložení vlajky (Přítomen/Chybí).
- Velký volitelný: Pokud je velikost hodnoty větší než velikost ukazatele, Optional používá dva "sloty" v paměti: jeden pro hodnotu samotnou (pokud je přítomná) a jeden pro vlajku přítomnosti. To mohou být dva sousední segmenty paměti nebo, v složitějších případech, odkaz na hodnotu alokovanou na haldě.
-
Pro typy, které splňují protokol
_ObjectiveCBridgeable(například třídy, některé struktury): Reprezentace Nullable ukazatele.- Pokud je typ třída nebo může být reprezentován jako ukazatel Objective-C, Optional využívá skutečnosti, že ukazatel může být
nil. V tomto případě jenilv Optional reprezentován jako nulový ukazatel, anon-nil` Optional jako ukazatel na objekt. To je efektivnější z hlediska paměti, protože nevyžaduje další vlajku.
- Pokud je typ třída nebo může být reprezentován jako ukazatel Objective-C, Optional využívá skutečnosti, že ukazatel může být
Shrnuto, Optional může zabírat buď trochu více místa než základní typ (Malý/Velký Optional), nebo stejnou velikost jako ukazatel (Nullable ukazatel). Konkrétní reprezentace je určena kompilátorem podle typu a jeho schopnosti být reprezentován jako nullable ukazatel.
// Příklad: Int není `_ObjectiveCBridgeable`, používá Malý/Velký Optional
var maybeInt: Int? = 10 // Může být Malý Optional
// Příklad: String `_ObjectiveCBridgeable`, může používat Nullable ukazatel
var maybeString: String? = "Hello" // Může být Nullable ukazatel
// Příklad: Protokol (Any) není `_ObjectiveCBridgeable`, používá Malý/Velký Optional
var maybeAny: Any? = 5 // Malý/Velký Optional