Kako se opcionalni podaci čuvaju u memoriji?
sobes.tech АИ
Одговор од АИ
Опционал у 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" за референтне типове и слична је за неке вредносне типове.