Hogyan tárolódnak az opcionális értékek a memóriában?
sobes.tech MI
Válasz az MI-től
A Swift-ben az opcionál egy két esetet tartalmazó felsorolás: .none (vagy nil) és .some(Wrapped).
enum Optional<Wrapped> {
case none
case some(Wrapped)
}
Amikor az opcionál értéket tartalmaz (.some(Wrapped)), tárolja a Wrapped típusú értéket magát, plusz egy extra bitet, ami jelzi az érték jelenlétét. Ha az opcionál nil (.none), csak ezt a bitet vagy egy speciális bájt mintát tárol, ami az érték hiányát jelzi.
A tárolási mód változhat a Wrapped típusától és a processzor architektúrájától (32-bit vs 64-bit) függően, de az általános ötlet az, hogy használjunk egy érték jelenlétét jelző indikátort. Referenciatípusok esetén például a nil null mutatóval reprezentálható, ha nincs szükség külön indikátorra vagy az összekapcsolódik. Értéktípusoknál további hely szükséges az indikátor számára.
Példa 64-bites architektúrával és indikátorral:
- Ha az
Optional<T>értéket tartalmaz: memóriaT-nek + 1 bit (vagy byte) az "érték van" indikátor számára. - Ha az
Optional<T>nil: általában egy speciális bájt mintát tárolnak vagy összekapcsolják mutatóval referencia típusok esetén.
Fontos megjegyezni, hogy azoknál a típusoknál, amelyek mérete kisebb, mint a saját igazításuk (például Bool 64-bites rendszeren), a jelenlét indikátort "beépíthetik" a maradék bitekbe, így memória takarítható meg. Ezt az optimalizációt "Nullable Pointer Optimization"-nak hívják referencia típusoknál, és hasonló néhány értéktípusnál is.