Sobes.tech
Middle+

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ória T-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.