ZST
- Rust kursu
- Uzman
- Ders 10/46
- 4 dk
Zero-sized type (ZST) kullanımını ve avantajlarını öğrenirsin.
ZST
Sıfır boyutlu türler (zero-sized types) hiç bellek kaplamaz: (), alansız struct'lar, [T; 0] ve PhantomData<T>. Derleyici onları tamamen siler; Vec<()> hiç ayırma yapmaz, HashMap<K, ()> ise bir HashSet'ten fazla yer tutmaz:
size_of::<()>() // 0
size_of::<PhantomData<u64>>() // 0
let v: Vec<()> = vec![(); 1_000_000]; // bellek ayırmazZST'ler tür düzeyinde bilgi taşımak için idealdir: işaretçi türler, durum makineleri (typestate), birim sistemleri.
Birim güvenliği
Sıfır maliyetli birim etiketleri, aynı sayıyı taşıyan ama birbirine karıştırılmaması gereken değerleri ayırır:
use std::marker::PhantomData;
struct Metre;
struct Saniye;
struct Olcu<B> {
deger: f64,
_birim: PhantomData<B>,
}
fn yol(m: Olcu<Metre>) -> f64 { m.deger }
// yol(Olcu::<Saniye> { .. }) // hata: birim uyuşmuyorOlcu<Metre> bellekte yalnızca bir f64'tür.
Uygulama Sıfır boyutlu türler
Yukarıdaki Olcu<B> türünü ve Metre birimini yaz. size_of::<()>(), size_of::<PhantomData<u64>>() ve size_of::<Olcu<Metre>>() değerlerini boşlukla yazdır.
Başlangıç kodu
use std::marker::PhantomData;
use std::mem::size_of;
fn main() {
// buraya yaz
}Örnek çözüm
#![allow(dead_code)]
use std::marker::PhantomData;
use std::mem::size_of;
struct Metre;
struct Olcu<B> {
deger: f64,
_birim: PhantomData<B>,
}
fn main() {
println!("{} {} {}", size_of::<()>(), size_of::<PhantomData<u64>>(), size_of::<Olcu<Metre>>());
}Beklenen çıktı
0 0 8
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>PhantomData<T></code> neden gerekir?
- Kullanılmayan tür parametresini derleyiciye "bu türe sahibim/ona bağlıyım" diye bildirmek için Doğru cevap
- Bellek ayırmak için
- Hız için
- Gerekmez
Açıklama: Kullanılmayan tür parametresi derleme hatasıdır (E0392); PhantomData ayrıca drop denetimi ve varyans için doğru bilgiyi verir.
2 Hayalet tür
struct Olcu<B> {
deger: f64,
_birim: ____<B>,
}
struct Olcu<B> {
deger: f64,
_birim: PhantomData<B>,
}
Açıklama: PhantomData<B> sıfır boyutludur ama B tür parametresini kullanır.
3 Tür ve boyutu
| Kavram | Anlamı |
|---|---|
() |
0 |
PhantomData<u64> |
0 bayt |
Olcu<Metre> |
8 |
[u8; 0] |
Sıfır (dizi) |