Sobes.tech
Middle+

Ako sa ukladá voliteľné v pamäti?

sobes.tech AI

Odpoveď od AI

Voliteľ v Swift predstavuje enumeráciu so dvoma prípadmi: .none (alebo nil) a .some(Wrapped).

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

Keď voliteľný obsahuje hodnotu (.some(Wrapped)), ukladá samotnú hodnotu typu Wrapped plus ďalší bit, ktorý indikuje prítomnosť hodnoty. Ak je voliteľný nil (.none), uloží sa iba tento bit alebo špeciálny vzor bajtov, ktorý indikuje absenciu hodnoty.

Spôsob ukladania sa môže líšiť v závislosti od typu Wrapped a architektúry procesora (32-bit vs 64-bit), ale všeobecná myšlienka je použiť indikátor prítomnosti hodnoty. Pre referenčné typy môže byť nil reprezentovaný nulovým ukazovateľom, ak nie je potrebný samostatný indikátor alebo je spojený s ním. Pre hodnotové typy je potrebné ďalšie miesto pre indikátor.

Príklad s 64-bitovou architektúrou a indikátorom:

  • Ak Optional<T> obsahuje hodnotu: pamäť pre T + 1 bit (alebo bajt) pre indikátor "je hodnota".
  • Ak je Optional<T> nil: zvyčajne sa uloží špeciálny vzor bajtov alebo sa spojí s ukazovateľom pre referenčné typy.

Je dôležité poznamenať, že pre typy, ktorých veľkosť je menšia ako ich prirodzené zarovnanie (napríklad Bool na 64-bitovom systéme), môže byť indikátor prítomnosti "integrovaný" do zostávajúcich bitov, čím sa šetrí pamäť. Táto optimalizácia sa nazýva "Nullable Pointer Optimization" pre referenčné typy a je podobná pre niektoré hodnotové typy.