Ana içeriğe geç
Programlama

Rust bellek mimarisinde sanal fonksiyon tabloları incelendi

Öne çıkanlar

  • Rust'ta dyn Trait referansları veri ve sanal tablo adresi olmak üzere 16 baytlık geniş işaretçi kullanır.
  • C++ en az 1 bayt alan ayırırken Rust sıfır alan içeren yapıları 0 bayt ile temsil eder.
  • Sanal tablo işaretçisi nesne gövdesine gömülmez, yalnızca çağrı anında dinamik referansla eşleşir.
  • Self döndüren ya da jenerik parametre içeren metotlar nesne güvenliği kuralı nedeniyle dinamik tabloda çalışmaz.

Rust dilinde dinamik çok biçimliliğin bellek katmanındaki işleyişi, C++ yaklaşımıyla karşılaştırmalı testlerle analiz edildi. Yazılım mühendisi Sofia Belen, "dyn Trait" yapısının bellek yerleşimini doğrudan işaretçi incelemeleriyle ortaya koydu. İnceleme, Rust'ın nesne odaklı dillerden farklı olarak sanal tablo işaretçilerini nesnenin içine gömmek yerine geniş işaretçiler aracılığıyla harici tuttuğunu gösterdi.

Deneylerde elde edilen bulgular, Rust'taki "dyn Trait" referanslarının 16 baytlık çift işaretçi yapısıyla çalıştığını kanıtladı. Bu yapının ilk 8 baytı verinin bellekteki adresini tutarken kalan 8 bayt ise çağrılacak metotların adreslerini barındıran sanal tabloya işaret ediyor. Ayrıca araştırmada sıfır boyutlu türlerin bellek boyutu sorgulandığında 0 bayt değerinin dönmesi, dilin nesne kimliğini bellek adresleriyle değil derleme anındaki sahiplik modeliyle takip ettiğini somutlaştırdı.

Sanal tabloların her tür ve özellik çifti için statik bellekte ayrı ayrı oluşturulduğu belirlendi. Rust'ın nesne güvenliği kuralları gereği, kendi türünü doğrudan döndüren veya jenerik parametre alan metotların dinamik tablolara aktarılamayacağı kaydedildi. Bu mekanizmanın çağrı tarafında seçilmesi sayesinde, statik dispatch tercih edildiğinde nesne başına fazladan bellek maliyeti oluşmuyor.

Kaynak

Bu özet yapay zekâ ile hazırlanmıştır; ayrıntılar ve doğrulama için orijinal kaynağa başvurun.