Sobes.tech
Middle+

Wie wird ein Optional in Swift im Speicher gespeichert?

sobes.tech KI

Antwort von AI

Optional in Swift wird im Speicher auf eine von zwei Arten gespeichert:

  1. Für Typen, die nicht dem Protokoll _ObjectiveCBridgeable entsprechen: Kleine/Große Optional-Darstellung.

    • Kleines Optional: Wenn die Größe des Wertes kleiner oder gleich der Größe eines Zeigers ist, fügt Optional ein Byte zur Typgröße hinzu, um eine Flagge (Vorhanden/Abwesend) zu speichern.
    • Großes Optional: Wenn die Größe des Wertes größer als die Größe eines Zeigers ist, verwendet Optional zwei "Slots" im Speicher: einen für den Wert selbst (falls vorhanden) und einen für die Präsenz-Flagge. Dies können entweder zwei benachbarte Speicherabschnitte sein oder, in komplexeren Fällen, eine Referenz auf einen auf dem Heap zugewiesenen Wert.
  2. Für Typen, die dem Protokoll _ObjectiveCBridgeable entsprechen (z.B. Klassen, einige Strukturen): Nullable Pointer Representation.

    • Wenn der Typ eine Klasse ist oder als Zeiger auf Objective-C dargestellt werden kann, nutzt Optional die Tatsache, dass ein Zeiger nil sein kann. In diesem Fall wird nil in Optional als Nullzeiger dargestellt, und nicht-nil` Optional als Zeiger auf ein Objekt. Dies ist speichereffizienter, da kein zusätzliches Flag erforderlich ist.

Kurz gesagt, kann Optional entweder etwas mehr Platz als der Basistyp benötigen (Kleines/Großes Optional) oder genau so viel wie ein Zeiger (Nullable Pointer). Die konkrete Darstellung wird vom Compiler basierend auf dem Typ und seiner Fähigkeit, als nullable Zeiger dargestellt zu werden, bestimmt.

// Beispiel: Int ist nicht _ObjectiveCBridgeable, verwendet Kleines/Großes Optional
var maybeInt: Int? = 10 // Kann Kleines Optional sein

// Beispiel: String _ObjectiveCBridgeable, kann Nullable Pointer verwenden
var maybeString: String? = "Hello" // Kann Nullable Pointer sein

// Beispiel: Protokoll (Any) nicht _ObjectiveCBridgeable, verwendet Kleines/Großes Optional
var maybeAny: Any? = 5 // Kleines/Großes Optional