Sobes.tech
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:

  1. 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.
  2. 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 je nil v Optional reprezentovaný ako nulový ukazovateľ, a non-nil` Optional ako ukazovateľ na objekt. To je efektívnejšie z hľadiska pamäte, pretože nevyžaduje ďalšiu vlajku.

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