Rust’ta Static ve Dynamic Dispatch (Trait Objects)

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Top Poster Of Month
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.

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.
Rust

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 bir Vec) 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 Kedi hem Kopek) 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.
Rust

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​

ÖzellikStatic Dispatch (<T: Trait>)Dynamic Dispatch (&dyn Trait)
Karar ZamanıDerleme ZamanıÇalışma Zamanı
MekanizmaMonomorphizationVtable (Sanal Tablo)
Çalışma HızıÇok Hızlı (Zero-cost)Bir miktar gecikmeli (Indirect call)
Binary BoyutuDaha BüyükDaha Küçük
KoleksiyonlarSadece 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&lt;Box&lt;dyn Widget&gt;&gt;) 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.

Özet​

Rust, size performansa mı yoksa esnekliğe mi ihtiyacınız olduğunu seçme şansı verir. Çoğu zaman derleyicinin her şeyi önceden bilmesini (Static) istersiniz, ancak çalışma zamanındaki belirsizlikleri yönetmek için dyn (Dynamic) anahtarı her zaman cebinizdedir.
 
Geri
Üst