Niche optimization
- Rust kursu
- Uzman
- Ders 11/46
- 4 dk
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 = 2Kendi 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>>()); // 4Niche'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
use std::mem::size_of;
use std::num::NonZeroU32;
fn main() {
// buraya yaz
}Örnek çözüm
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<Box<T>></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ı
use std::num::____;
let id = NonZeroU32::new(42); // Some(42)
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 |