Sobes.tech
Middle+

Opsiyoneller değerler bellekte nasıl saklanır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Swift'teki Optional, iki duruma sahip bir enumu temsil eder: .none (veya nil) ve .some(Wrapped).

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

Bir optional değer içerdiğinde (.some(Wrapped)), kendisi Wrapped türündeki değeri ve ek bir biti tutar, bu bit değerin var olup olmadığını gösterir. Eğer optional nil ise (.none), sadece bu bit veya değerin olmadığını gösteren özel bir bayt deseni saklanır.

Depolama şekli, Wrapped türüne ve işlemci mimarisine (32-bit veya 64-bit) bağlı olarak değişebilir, ancak temel fikir, bir değer varlığı göstergesi kullanmaktır. Referans türleri için, örneğin, nil sıfır gösterici ile temsil edilebilir, bu gösterge gerekmediğinde veya birleştirildiğinde. Değer türleri için ek alan gerekebilir.

64-bit mimarisi ve gösterge ile örnek:

  • Eğer Optional<T> bir değer içeriyorsa: T için bellek + "değer var" göstergesi için 1 bit (veya bayt).
  • Eğer Optional<T> nil ise: genellikle özel bir bayt deseni saklanır veya referans türleri için gösterici ile birleştirilir.

Önemli not: kendi hizalamasından küçük boyuttaki türler (örneğin, 64-bit sistemde Bool), göstergeyi kalan bitlere "gömülü" hale getirebilir, böylece bellek tasarrufu sağlar. Bu optimizasyon "Nullable Pointer Optimization" olarak adlandırılır ve bazı değer türleri için de benzerdir.