Ինչպե՞ս են պահվում ընտրանքային արժեքները հիշողության մեջ։
sobes.tech AI
Պատասխան AI-ից
Swift-ում օպցիոնալը ներկայացնում է երկու դեպք ունեցող enumeration՝ .none (կամ nil) և .some(Wrapped):
enum Optional<Wrapped> {
case none
case some(Wrapped)
}
Երբ օպցիոնալը պարունակում է արժեք (.some(Wrapped)), այն պահում է Wrapped տիպի արժեքը և լրացուցիչ մի բիթ, որը ցույց է տալիս արժեքի առկայությունը։ Եթե օպցիոնալը nil է (.none), պահվում է միայն այդ բիթը կամ հատուկ բայթների օրինակ, որը ցույց է տալիս արժեքի բացակայությունը։
Պահպանման եղանակը կարող է տարբեր լինել Wrapped տիպի և պրոցեսորի ճարտարապետության (32-բիթ կամ 64-բիթ) կախված։ Հիմնական գաղափարը՝ օգտագործել նշիչ, որը ցույց է տալիս արժեքի առկայությունը։ Հղման տիպերի համար, օրինակ, nil կարող է ներկայացվել որպես զրո ցուցիչ, երբ նշիչը անհրաժեշտ չէ կամ այն համակցված է։ Վարժական տիպերի համար անհրաժեշտ է լրացուցիչ տարածք նշիչի համար։
64-բիթային ճարտարապետության և նշիչի օրինակ՝
- Եթե
Optional<T>պարունակում է արժեք՝ հիշողությունT-ի համար + 1 բիթ (կամ բայթ) «արժեք կա» նշիչի համար։ - Եթե
Optional<T>nilէ՝ սովորաբար պահվում է հատուկ բայթների օրինակ կամ համակցվում է ցուցիչի հետ՝ հղման տիպերի համար։
Կարևոր է նշել, որ այն տիպերի համար, որոնց չափը փոքր է իրենց բնական հարթումից (օրինակ, Bool 64-բիթային համակարգում), նշիչը կարող է «ներգրավվել» մնացած բիթերի մեջ՝ խնայելով հիշողությունը։ Այս օպտիմալացումը կոչվում է «Nullable Pointer Optimization»՝ հղման տիպերի համար, և նման է որոշ արժեքային տիպերի համար։