Alignment ve padding
- Rust kursu
- Uzman
- Ders 9/46
- 4 dk
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 yokHizası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
use std::mem::{align_of, size_of};
fn main() {
// buraya yaz
}Örnek çözüm
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
println!("{}", std::mem::____::<u64>()); // 8
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 |