Middle+
Jak opcjonalny jest przechowywany w pamięci w Swift?
sobes.tech AI
Odpowiedź od AI
Opcjonalny w Swift jest przechowywany w pamięci na jeden z dwóch sposobów:
-
Dla typów, które nie spełniają protokołu
_ObjectiveCBridgeable: Reprezentacja Małego/Dużego Opcjonalnego.- Mały Opcjonalny: Jeśli rozmiar wartości jest mniejszy lub równy rozmiarowi wskaźnika, Optional dodaje jeden bajt do rozmiaru typu, aby przechowywać flagę (Obecny/Brakujący).
- Duży Opcjonalny: Jeśli rozmiar wartości jest większy niż rozmiar wskaźnika, Optional używa dwóch "slotów" w pamięci: jeden dla samej wartości (jeśli jest obecna) i jeden dla flagi obecności. Mogą to być dwa sąsiednie segmenty pamięci lub, w bardziej złożonych przypadkach, odwołanie do wartości przydzielonej na stercie.
-
Dla typów spełniających protokół
_ObjectiveCBridgeable(np. klasy, niektóre struktury): Reprezentacja wskaźnika Nullable.- Jeśli typ jest klasą lub może być reprezentowany jako wskaźnik Objective-C, Optional korzysta z faktu, że wskaźnik może być
nil. W tym przypadkunilw Optional jest reprezentowany jako nullowy wskaźnik, a nie-nilOptional jako wskaźnik na obiekt. Jest to bardziej efektywne pod względem pamięci, ponieważ nie wymaga dodatkowego flagi.
- Jeśli typ jest klasą lub może być reprezentowany jako wskaźnik Objective-C, Optional korzysta z faktu, że wskaźnik może być
Podsumowując, Optional może zajmować nieco więcej miejsca niż podstawowy typ (Mały/Duży Optional), lub tyle samo co wskaźnik (Wskaźnik Nullable). Konkretna reprezentacja jest określana przez kompilator w zależności od typu i jego zdolności do bycia reprezentowanym jako nullable wskaźnik.
// Przykład: Int nie jest `_ObjectiveCBridgeable`, używa Małego/Dużego Optional
var maybeInt: Int? = 10 // Może być Małym Optional
// Przykład: String `_ObjectiveCBridgeable`, może używać Nullable Pointer
var maybeString: String? = "Hello" // Może być Nullable Pointer
// Przykład: Protokół (Any) nie jest `_ObjectiveCBridgeable`, używa Małego/Dużego Optional
var maybeAny: Any? = 5 // Mały/Duży Optional