CodeBlanks Logo Icon CodeBlanks

ZST

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ırmaz

ZST'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şmuyor

Olcu<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

main.rs
use std::marker::PhantomData;
use std::mem::size_of;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
#![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&lt;T&gt;</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

Soru
struct Olcu<B> {
    deger: f64,
    _birim: ____<B>,
}
Cevap
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)

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