Kaip opcionai saugomi atmintyje?
sobes.tech AI
Atsakymas iš AI
Swift'e pasirinktinė reikšmė yra išvardijimas su dviem atvejais: .none (arba nil) ir .some(Wrapped).
enum Optional<Wrapped> {
case none
case some(Wrapped)
}
Kai pasirinktinė reikšmė turi reikšmę (.some(Wrapped)), ji saugo pačią reikšmę iš tipo Wrapped ir papildomą bitą, kuris nurodo reikšmės buvimą. Jei pasirinktinė reikšmė yra nil (.none), saugomas tik tas bitas arba specialus baitų raštas, kuris nurodo reikšmės nebuvimą.
Saugojimo būdas gali skirtis priklausomai nuo Wrapped tipo ir procesoriaus architektūros (32-bit arba 64-bit), tačiau bendroji idėja yra naudoti indikatorių, rodantį reikšmės buvimą. Referencinių tipų atveju, pavyzdžiui, nil gali būti vaizduojamas kaip nulinis rodyklė, jei indikatorius nereikalingas arba jis yra sujungtas. Vertės tipų atveju, reikalinga papildoma vieta indikatoriams.
Pavyzdys su 64-bitų architektūra ir indikatoriumi:
- Jei
Optional<T>turi reikšmę: atmintisT+ 1 bit (arba baitas) "reikšmė yra" indikatorius. - Jei
Optional<T>yranil: dažniausiai saugomas specialus baitų raštas arba sujungtas su rodykle, skirtas referenciniams tipams.
Svarbu pažymėti, kad tipams, kurių dydis yra mažesnis nei jų natūralus išlyginimas (pavyzdžiui, Bool 64-bitų sistemoje), buvimo indikatorius gali būti "įmontuotas" į likusius bitus, taupant atmintį. Ši optimizacija vadinama "Nullable Pointer Optimization" ir taikoma kai kuriems vertės tipams.