Sobes.tech
Middle+

Wie werden optionale Werte im Speicher gespeichert?

sobes.tech KI

Antwort von AI

Optional in Swift stellt eine Enumeration mit zwei Fällen dar: .none (oder nil) und .some(Wrapped).

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

Wenn der Optional einen Wert enthält (.some(Wrapped)), speichert er den Wert selbst vom Typ Wrapped sowie ein zusätzliches Bit, das auf die Anwesenheit des Wertes hinweist. Wenn der Optional nil ist (.none), wird nur dieses Bit oder ein spezielles Byte-Muster gespeichert, das das Fehlen eines Wertes anzeigt.

Die Speicherungsart kann je nach Typ Wrapped und Prozessorarchitektur (32-Bit vs 64-Bit) variieren, aber die Grundidee ist die Verwendung eines Indikators für die Anwesenheit eines Wertes. Bei Referenztypen kann nil beispielsweise durch einen Null-Pointer dargestellt werden, wenn kein separater Indikator erforderlich ist oder dieser kombiniert wird. Für Werttypen ist zusätzlicher Platz für den Indikator erforderlich.

Beispiel mit 64-Bit-Architektur und Indikator:

  • Wenn Optional<T> einen Wert enthält: Speicher für T + 1 Bit (oder Byte) für den "Wert vorhanden"-Indikator.
  • Wenn Optional<T> nil ist: Wird in der Regel ein spezielles Byte-M Muster gespeichert oder mit einem Zeiger für Referenztypen kombiniert.

Es ist wichtig zu beachten, dass für Typen, deren Größe kleiner ist als ihre natürliche Ausrichtung (z.B. Bool auf einem 64-Bit-System), der Anwesenheitsindikator "eingebaut" sein kann in die verbleibenden Bits, um Speicher zu sparen. Diese Optimierung wird als "Nullable Pointer Optimization" für Referenztypen bezeichnet und ist bei einigen Werttypen ähnlich.