Rust'ta veri yerleşiminin optimizasyonu, kaynakları kaybetmeden kullanma imkanı sağlayan önemli bir özelliktir. Enum Düzeni, derleyicinin enum türündeki (yapı veya ilkel tür seçenekleri ile) varyantları ve herhangi bir yapının kendisindeki alanları nasıl yerleştirdiğidir. Diğer dillerde bu tür optimizasyonlar genellikle gizlidir, ancak Rust'ta alanların sırası dikkate alınmazsa bellek aşımı yaşanabilir.
Eğer bir yapıda alanların sırası kötü seçilirse, verilerin hizalanma özellikleri nedeniyle yapı "şişmeye" başlayabilir. İlişkilendirilmiş verilere sahip enumlar için durum daha karmaşık hale gelir; enumun boyutu en büyük varyantın boyutu artı ayırt edici (discriminator) boyutu ile belirlenir. Bunun göz ardı edilmesi, bellek tüketiminde artışa ve işlemci önbellek verimliliğinde azalmaya neden olabilir.
Yapıların ve enumların verimli bir şekilde paketlenmesi için önce en "geniş" alanları, ardından daha dar olanları yerleştirmek ve derleyicinin ekleyebileceği dolgu boşluklarını dikkate almak önemlidir. Enumlar için, izin verilmeyen maksimum boyuta ulaşmamaları için varyant yapısını seçmek gerekir.
Kod örneği:
struct KötüHizalanma { a: u8, b: u32, c: u16, } struct İyiHizalanma { b: u32, c: u16, a: u8, } enum Paket { A(u8), B(u32, [u8; 10]), }
Ana özellikler:
Alanların sırasını değiştirerek bir yapıyı daha küçük hale getirmek mümkün mü?
Evet. Alanlar boyut azalış sırasına göre sıralandığında, derleyici genellikle dolgu miktarını azaltarak yapının toplam boyutunu küçültebilir.
println!("{}", std::mem::size_of::<KötüHizalanma>()); // örneğin, 12 println!("{}", std::mem::size_of::<İyiHizalanma>()); // örneğin, 8
Alanların sıralaması onların erişim hızını etkiler mi?
Sıranın kendisi alanlara erişim hızını etkilemez. Ancak yapı üzerinde düşük seviyeli (örneğin, SIMD talimatları ile veya döngüde yapı dizileri ile çalışırken) ardışık geçiş yapıldığında doğru hizalama, önbelleğin daha iyi kullanılmasını sağlayarak erişimi hızlandırır.
Bir enumun bir varyantı çok büyükse, diğer varyantları ne olursa olsun her enum örneği aynı miktarda bellek tüketir mi?
Evet, enumun boyutu her zaman en büyük varyantın boyutuna artı ayırt edici (discriminator) boyutuna bağlıdır. Her Paket, içinde A yer alsa bile, B boyutunu alacaktır.
** Olumsuz Durum
Yapıda u8, ardından u64 alanı mevcut. 100000 kayıt içeren bir dizide kullanımı, dolgu nedeniyle bir gigabayta kadar bellek harcıyor.
Artıları:
Eksileri:
**Pozitif Durum
Yapılar, alan genişliklerine göre sıralandı, büyük varyantlar Box içine alındı, küçükler yerinde bırakıldı.
Artıları:
Eksileri: