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:
-
Für Typen, die nicht dem Protokoll
_ObjectiveCBridgeableentsprechen: 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.
-
Für Typen, die dem Protokoll
_ObjectiveCBridgeableentsprechen (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
nilsein kann. In diesem Fall wirdnilin Optional als Nullzeiger dargestellt, undnicht-nil` Optional als Zeiger auf ein Objekt. Dies ist speichereffizienter, da kein zusätzliches Flag erforderlich ist.
- Wenn der Typ eine Klasse ist oder als Zeiger auf Objective-C dargestellt werden kann, nutzt Optional die Tatsache, dass ein Zeiger
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