Sobes.tech
Middle+

Seçeneklər yaddaşda necə saxlanılır?

sobes.tech Süni İntellekt

AI-dan cavab

Swift-də optional iki haldan ibarət olan enumerasiyadır: .none (və ya nil) və .some(Wrapped).

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

Əgər optional dəyər saxlayırsa (.some(Wrapped)), o, Wrapped tipindəki dəyəri və əlavə bir biti saxlayır ki, bu da dəyərin olub-olmadığını göstərir. Əgər optional nil-dirsə (.none), yalnız bu bit və ya xüsusi bayt nümunəsi saxlanılır ki, bu da dəyərin olmamasını göstərir.

Yadda saxlamanın üsulu Wrapped tipindən və prosessor arxitekturasından (32-bit və ya 64-bit) asılı olaraq dəyişə bilər, amma ümumi fikir — dəyərin olub-olmadığını göstərən göstəricidən istifadə etməkdir. Referans tiplər üçün, məsələn, nil null göstərici ilə təmsil oluna bilər, göstərici lazım olmadıqda və ya birləşdirildikdə. Dəyər tipləri üçün əlavə yer göstərici üçün tələb olunur.

64-bit arxitektura və göstərici nümunəsi:

  • Əgər Optional<T> dəyər saxlayırsa: T üçün yaddaş + 1 bit (və ya bayt) "dəyər var" göstəricisi üçün.
  • Əgər Optional<T> nil-dirsə: adətən xüsusi bayt nümunəsi saxlanılır və ya referans tiplər üçün göstərici ilə birləşdirilir.

Əhəmiyyətlidir ki, ölçüsü özünün təbii hizalanmasından kiçik olan tiplər üçün (məsələn, 64-bitlik sistemdə Bool), mövcudluq göstəricisi "daxil edilə bilər" qalan bitlərə, yaddaş qənaət etmək üçün. Bu optimallaşdırma "Nullable Pointer Optimization" adlanır və bəzi dəyər tipləri üçün də oxşardır.