CodeBlanks Logo Icon CodeBlanks

Niche optimization

Niche optimization ile enum boyutunu küçültmeyi öğrenirsin.

Niche optimization

Bazı türlerde hiç kullanılmayan bit desenleri vardır: &T ve Box<T> asla boş değildir, bool yalnızca 0 ya da 1'dir, NonZeroU32 0 olamaz, char belirli aralıklar dışındadır. Derleyici bu "boşlukları" (niche) enum ayırt edicisini saklamak için kullanır; böylece Option ek bayt gerektirmez:

size_of::<Option<&u8>>()        // 8: None = boş işaretçi
size_of::<Option<NonZeroU32>>()  // 4: None = 0
size_of::<Option<u32>>()         // 8: u32'de boş desen yok
size_of::<Option<bool>>()        // 1: None = 2

Kendi türünde niche

Kimlikleri NonZeroU32 ile tutmak, "geçersiz kimlik" durumunu bedavaya Option ile ifade etmeyi sağlar:

use std::num::NonZeroU32;

struct KullaniciId(NonZeroU32);

let id = NonZeroU32::new(42).map(KullaniciId);   // Some
let bos = NonZeroU32::new(0);                     // None
println!("{}", size_of::<Option<KullaniciId>>()); // 4

Niche'ler iç içe de çalışır: Option<Option<bool>> hâlâ 1 bayttır.

Uygulama Niche boyutları

Option<&u8>, Option<NonZeroU32>, Option<u32> ve Option<bool> türlerinin size_of değerlerini boşlukla tek satırda yazdır.

Başlangıç kodu

main.rs
use std::mem::size_of;
use std::num::NonZeroU32;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::mem::size_of;
use std::num::NonZeroU32;

fn main() {
    println!(
        "{} {} {} {}",
        size_of::<Option<&u8>>(),
        size_of::<Option<NonZeroU32>>(),
        size_of::<Option<u32>>(),
        size_of::<Option<bool>>()
    );
}

Beklenen çıktı

8 4 8 1

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Neden <code>Option&lt;Box&lt;T&gt;&gt;</code> FFI'da C'nin boş olabilen işaretçisi yerine kullanılabilir?

  • Box C'de vardır
  • Kullanılamaz
  • Her zaman 16 bayttır
  • None'ın boş işaretçi olarak temsil edilmesi garanti edilmiştir Doğru cevap

Açıklama: Bu, belgelenmiş birkaç niche garantisinden biridir: Option<&T>, Option<Box<T>>, Option<NonNull<T>>, Option<extern fn>.

2 Sıfır olmayan tamsayı

Soru
use std::num::____;
let id = NonZeroU32::new(42);   // Some(42)
Cevap
use std::num::NonZeroU32;
let id = NonZeroU32::new(42);   // Some(42)

Açıklama: NonZeroU32 0 olamaz; bu yüzden Option<NonZeroU32> 4 bayttır.

3 Tür ve boyutu (64 bit)

Kavram Anlamı
Option<&u8> 8
Option<NonZeroU32> 4
Option<u32> 8 (ek etiket)
Option<bool> 1

Uzman bölümündeki tüm dersler