Sobes.tech
Middle+

Hoe worden optionele waarden in het geheugen opgeslagen?

sobes.tech AI

Antwoord van AI

Optioneel in Swift vertegenwoordigt een enumeratie met twee gevallen: .none (of nil) en .some(Wrapped).

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

Wanneer de optioneel een waarde bevat (.some(Wrapped)), slaat hij de waarde zelf op van het type Wrapped plus een extra bit dat aangeeft of er een waarde is. Als de optioneel nil is (.none), wordt alleen dat bit of een speciaal bytepatroon opgeslagen dat het ontbreken van een waarde aangeeft.

De opslagmethode kan variëren afhankelijk van het type Wrapped en de architectuur van de processor (32-bit vs 64-bit), maar het algemene idee is het gebruik van een indicator voor de aanwezigheid van een waarde. Voor referentietypen kan nil bijvoorbeeld worden weergegeven door een null-pointer, wanneer de indicator niet nodig is of wordt gecombineerd. Voor waardetypen is extra ruimte voor de indicator vereist.

Voorbeeld met 64-bit architectuur en indicator:

  • Als Optional<T> een waarde bevat: geheugen voor T + 1 bit (of byte) voor de "waarde aanwezig" indicator.
  • Als Optional<T> nil is: wordt meestal een speciaal bytepatroon opgeslagen of wordt gecombineerd met een pointer voor referentietypen.

Het is belangrijk op te merken dat voor typen waarvan de grootte kleiner is dan de natuurlijke uitlijning (bijvoorbeeld Bool op een 64-bit systeem), de aanwezigheid-indicator "ingebouwd" kan worden in de resterende bits, waardoor geheugen wordt bespaard. Deze optimalisatie wordt "Nullable Pointer Optimization" genoemd voor referentietypen en is vergelijkbaar voor sommige waardetypen.