CodeBlanks Logo Icon CodeBlanks

Alignment ve padding

Hizalama (alignment) ve dolgu (padding) kavramlarını öğrenirsin.

Alignment ve padding

Her türün bir hizalaması vardır: değer yalnızca o sayının katı olan adreslerde durabilir. İlkel türlerde hizalama genellikle boyuta eşittir (u8: 1, u16: 2, u32: 4, u64: 8). Bileşik türün hizalaması alanlarının en büyük hizalamasıdır; aradaki boş baytlara padding denir:

align_of::<u64>()       // 8
size_of::<(u8, u32)>()  // 8: 1 + 3 boşluk + 4
size_of::<[u16; 3]>()   // 6: dizilerde elemanlar arasında boşluk yok

Hizasız erişim bazı işlemcilerde yavaş, bazılarında ise donanım hatasıdır; Rust bu yüzden hizalamayı tür sistemiyle garanti eder.

Önbellek ve boyut

Küçük veri daha çok önbellek satırına sığar ve daha hızlı işlenir. Milyonlarca elemanlı bir vektörde struct başına 8 bayt boşluk, megabaytlarca boşa harcanan bellek demektir. Sık kullanılan iyileştirmeler: alan sırasını düzenlemek, bool bayrakları bit alanlarında toplamak, usize yerine yeterliyse u32 indeks kullanmak, "struct of arrays" düzenine geçmek.

// array of structs           // struct of arrays
struct P { x: f32, y: f32 }   struct Ps { x: Vec<f32>, y: Vec<f32> }
Vec<P>                        // yalnızca x üzerinde dolaşan döngü daha hızlı

Uygulama Hizalama ve boyut

align_of::<u64>(), size_of::<(u8, u32)>() ve size_of::<[u16; 3]>() değerlerini boşlukla tek satırda yazdır.

Başlangıç kodu

main.rs
use std::mem::{align_of, size_of};

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::mem::{align_of, size_of};

fn main() {
    println!("{} {} {}", align_of::<u64>(), size_of::<(u8, u32)>(), size_of::<[u16; 3]>());
}

Beklenen çıktı

8 8 6

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir struct'ın boyutunu küçültmek için repr(C)'de ne yapılabilir?

  • Box kullanmak
  • Alanları hizalamaya göre büyükten küçüğe elle sıralamak Doğru cevap
  • Hiçbir şey
  • Alanları gizli yapmak

Açıklama: repr(C) sırayı korur; yeniden sıralamayı programcı yapmalıdır. repr(Rust) bunu otomatik yapar.

2 Hizalamayı sor

Soru
println!("{}", std::mem::____::<u64>());   // 8
Cevap
println!("{}", std::mem::align_of::<u64>());   // 8

Açıklama: align_of türün hizalamasını verir.

3 Tür ve boyutu

Kavram Anlamı
(u8, u32) 8
[u16; 3] 6
(u8, u8) 2
(u64, u8) 16

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