Sobes.tech
Middle+

Kuidas salvestatakse valikulised väärtused mälus?

sobes.tech AI

Vastus AI-lt

Swiftis on valikuline tüüp, mis esindab kahe juhtumi enumerationit: .none (või nil) ja .some(Wrapped).

enum Optional<Wrapped> {
    case none
    case some(Wrapped)
}

Kui valikuline sisaldab väärtust (.some(Wrapped)), siis ta salvestab selle väärtuse ise Wrapped tüübist ning lisab sellele ühe bitti, mis näitab väärtuse olemasolu. Kui valikuline on nil (.none), salvestatakse ainult see bitt või spetsiaalne baitide muster, mis näitab väärtuse puudumist.

Salvestusviis võib sõltuda Wrapped tüübi ja protsessori arhitektuuri (32-bit või 64-bit) erinevustest, kuid üldine mõte on kasutada näitajat, mis näitab väärtuse olemasolu. Viidete tüüpide puhul võib nil olla esitatud null-viitena, kui näitaja ei ole vajalik või see on ühendatud. Väärtusetüüpide puhul on vaja täiendavat ruumi näitaja jaoks.

Näide 64-bitise arhitektuuri ja näitajaga:

  • Kui Optional<T> sisaldab väärtust: mälu T jaoks + 1 bitti (või bait) "väärtus olemas" näitaja jaoks.
  • Kui Optional<T> on nil: tavaliselt salvestatakse spetsiaalne baitide muster või ühendatakse näitajaga viidetüüpide jaoks.

Oluline on märkida, et tüüpide puhul, mille suurus on väiksem kui nende loomulik joondus (näiteks Bool 64-bitise süsteemi puhul), võib olemasolu näitaja olla "sisseehitatud" järelejäänud bittidesse, säästes mälu. Seda optimeerimist nimetatakse "Nullable Pointer Optimization" ning see on sarnane mõnele väärtustüübile.