- Katılım
- 7 Ocak 2026
- Mesajlar
- 234
- Tepkime puanı
- 2
- Puanları
- 18
Rust'ta Dispatch, derleyicinin veya işlemcinin "hangi metodun çağrılacağını" belirleme sürecidir. Özellikle Trait'ler söz konusu olduğunda Rust, esneklik ve performans dengesini kurmak için iki farklı yöntem sunar: Static Dispatch ve Dynamic Dispatch.
Dynamic Dispatch kullanmak için Trait Objects (
1. Static Dispatch (Generics)
Static Dispatch, Rust'ın varsayılan yöntemidir ve Generics kullanılarak gerçekleştirilir. Derleyici, kodu derlerken her bir somut tip için fonksiyonun özel bir kopyasını oluşturur. Buna Monomorphization denir.Özellikleri:
- Performans: En hızlı yöntemdir. Çağrılacak fonksiyon derleme zamanında (compile-time) bellidir, bu nedenle "inline" optimizasyonlar yapılabilir.
- Boyut: Her tip için ayrı kod üretildiğinden, binary dosya boyutu (binary bloat) artabilir.
Kod:
fn ses_cikar_static<T: SesCikar>(hayvan: T) {
hayvan.ses_ver();
}
2. Dynamic Dispatch (Trait Objects)
Dynamic Dispatch, hangi metodun çağrılacağının çalışma zamanında (runtime) belirlendiği yöntemdir. Bu yöntem, farklı tiplerdeki nesneleri aynı koleksiyonda (örneğin birVec) tutmak istediğinizde zorunludur.Dynamic Dispatch kullanmak için Trait Objects (
&dyn Trait veya Box<dyn Trait>) kullanılır.Özellikleri:
- Esneklik: Farklı somut tipleri (örneğin hem
KedihemKopek) aynı veri yapısında saklamanıza olanak tanır. - Performans: Static dispatch'e göre biraz daha yavaştır. Çünkü işlemci önce bir vtable (virtual method table) üzerinden metodun adresini bulmalı, sonra oraya atlamalıdır.
- Boyut: Tek bir fonksiyon kopyası üretildiği için binary boyutu daha küçüktür.
Kod:
// dyn anahtar kelimesi bunun bir Trait Object olduğunu belirtir
fn ses_cikar_dynamic(hayvan: &dyn SesCikar) {
hayvan.ses_ver();
}
3. Karşılaştırma Tablosu
| Özellik | Static Dispatch (<T: Trait>) | Dynamic Dispatch (&dyn Trait) |
| Karar Zamanı | Derleme Zamanı | Çalışma Zamanı |
| Mekanizma | Monomorphization | Vtable (Sanal Tablo) |
| Çalışma Hızı | Çok Hızlı (Zero-cost) | Bir miktar gecikmeli (Indirect call) |
| Binary Boyutu | Daha Büyük | Daha Küçük |
| Koleksiyonlar | Sadece tek tip (Homojen) | Farklı tipler bir arada (Heterojen) |
4. Ne Zaman Hangisini Seçmeli?
- Kütüphane geliştiriyorsanız: Genellikle Static Dispatch tercih edilir. Kullanıcıya en yüksek performansı verirsiniz.
- Farklı nesnelerden oluşan bir liste yönetiyorsanız: (Örn: Bir GUI uygulamasında farklı buton, metin kutusu ve resim objelerini içeren bir Vec<Box<dyn Widget>>
Dynamic Dispatch kullanmak zorundasınızdır. - Kodun okunabilirliği ve derleme süresi: Eğer generic yapıları çok fazla iç içe kullanırsanız derleme süresi uzayabilir; bu durumda dyn kodun daha temiz kalmasını sağlayabilir.
Önemli Not: Bir Trait'in "Trait Object" (dyn) olarak kullanılabilmesi için Object Safe olması gerekir. Yani metodlarının self yerine Self dönmemesi veya generic parametre almaması gibi belirli kuralları vardır.