Sobes.tech
Middle+

Come vengono memorizzati gli opzionali in memoria?

sobes.tech AI

Risposta dell'AI

Facoltativo in Swift rappresenta un'enumerazione con due casi: .none (o nil) e .some(Wrapped).

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

Quando l'opzionale contiene un valore (.some(Wrapped)), memorizza il valore stesso del tipo Wrapped più un bit aggiuntivo che indica la presenza del valore. Se l'opzionale è nil (.none), viene memorizzato solo questo bit o un pattern speciale di byte che indica l'assenza di valore.

Il metodo di memorizzazione può variare a seconda del tipo Wrapped e dell'architettura del processore (32-bit vs 64-bit), ma l'idea generale è usare un indicatore di presenza del valore. Per i tipi di riferimento, ad esempio, nil può essere rappresentato da un puntatore nullo, quando l'indicatore non è necessario o è combinato. Per i tipi di valore, è richiesto spazio aggiuntivo per l'indicatore.

Esempio con architettura a 64 bit e indicatore:

  • Se Optional<T> contiene un valore: memoria per T + 1 bit (o byte) per l'indicatore "c'è valore".
  • Se Optional<T> è nil: di solito si memorizza un pattern speciale di byte o si combina con un puntatore per i tipi di riferimento.

È importante notare che, per tipi di dimensione inferiore alla loro naturale allineamento (ad esempio, Bool su un sistema a 64 bit), l'indicatore di presenza può essere "incorporato" nei bit rimanenti, risparmiando memoria. Questa ottimizzazione si chiama "Nullable Pointer Optimization" per i tipi di riferimento ed è simile per alcuni tipi di valore.