Middle+
Ako sa optional ukladá v pamäti v Swift?
sobes.tech AI
Odpoveď od AI
Voliteľný v Swiftu sa ukladá v pamäti jedným zo dvoch spôsobov:
-
Pre typy, ktoré nespĺňajú protokol
_ObjectiveCBridgeable: Reprezentácia Malého/Veľkého Voliteľného.- Malé Voliteľné: Ak je veľkosť hodnoty menšia alebo rovná veľkosti ukazovateľa, Optional pridá jeden bajt k veľkosti typu na uloženie vlajky (Prítomný/Chýba).
- Veľké Voliteľné: Ak je veľkosť hodnoty väčšia ako veľkosť ukazovateľa, Optional používa dva "sloty" v pamäti: jeden pre hodnotu samotnú (ak je prítomná) a jeden pre vlajku prítomnosti. To môžu byť dva susediace segmenty pamäti alebo, v zložitejších prípadoch, odkaz na hodnotu alokovanú na halde.
-
Pre typy, ktoré spĺňajú protokol
_ObjectiveCBridgeable(napríklad, triedy, niektoré štruktúry): Reprezentácia Nullable ukazovateľa.- Ak je typ trieda alebo môže byť reprezentovaný ako ukazovateľ Objective-C, Optional využíva fakt, že ukazovateľ môže byť
nil. V tomto prípade jenilv Optional reprezentovaný ako nulový ukazovateľ, anon-nil` Optional ako ukazovateľ na objekt. To je efektívnejšie z hľadiska pamäte, pretože nevyžaduje ďalšiu vlajku.
- Ak je typ trieda alebo môže byť reprezentovaný ako ukazovateľ Objective-C, Optional využíva fakt, že ukazovateľ môže byť
Zhrnuté, Optional môže zaberáť buď trochu viac miesta ako základný typ (Malé/Veľké Optional), alebo rovnaké ako ukazovateľ (Nullable ukazovateľ). Konkrétne zobrazenie určuje prekladač v závislosti od typu a jeho schopnosti byť reprezentovaný ako nullable ukazovateľ.
// Príklad: Int nie je `_ObjectiveCBridgeable`, používa Malé/Veľké Optional
var maybeInt: Int? = 10 // Môže byť Malé Optional
// Príklad: String `_ObjectiveCBridgeable`, môže používať Nullable ukazovateľ
var maybeString: String? = "Hello" // Môže byť Nullable ukazovateľ
// Príklad: Protokol (Any) nie je `_ObjectiveCBridgeable`, používa Malé/Veľké Optional
var maybeAny: Any? = 5 // Malé/Veľké Optional