Özet - Bellek düzeni
- Rust kursu
- Uzman
- Ders 12/46
- 5 dk
repr, alignment ve ZST'yi birleştirerek bir bellek analizi yazarsın.
Bellek düzeni özeti
Varsayılan düzen derleyiciye alanları yeniden sıralama özgürlüğü verir; repr(C) sırayı ve C uyumunu garanti eder, repr(transparent) sarmalayıcıyı içteki türle aynı yapar, repr(u8) enum ayırt edicisini sabitler. Hizalama, değerin hangi adreslerde durabileceğini belirler ve boşluk (padding) üretir. ZST'ler hiç yer kaplamaz; niche optimizasyonu Option gibi enum'ların ek bayt kullanmamasını sağlar. Düzene güvenen kod her zaman açık bir repr kullanmalıdır.
Elle yeniden sıralama
repr(C) gerektiğinde boşluğu programcı azaltır. Kural: alanları hizalamaya göre büyükten küçüğe diz:
#[repr(C)]
struct Kotu { a: u8, b: u64, c: u8 } // 24
#[repr(C)]
struct Iyi { b: u64, a: u8, c: u8 } // 16: 8 + 1 + 1 + 6 boşlukClippy'nin clippy::pedantic grubu ve cargo +nightly rustc -- -Zprint-type-sizes, büyük boşlukları bulmaya yardım eder.
Uygulama Boşluğu azalt
Yukarıdaki #[repr(C)] struct Kotu ve #[repr(C)] struct Iyi türlerini yaz. İkisinin size_of değerini boşlukla yazdır.
Başlangıç kodu
use std::mem::size_of;
fn main() {
// buraya yaz
}Örnek çözüm
#![allow(dead_code)]
use std::mem::size_of;
#[repr(C)]
struct Kotu {
a: u8,
b: u64,
c: u8,
}
#[repr(C)]
struct Iyi {
b: u64,
a: u8,
c: u8,
}
fn main() {
println!("{} {}", size_of::<Kotu>(), size_of::<Iyi>());
}Beklenen çıktı
24 16
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>#[repr(C)] struct { a: u8, b: u64, c: u8 }</code> neden 24 bayttır?
- Hata
- 16 bayttır
- a sonrası 7, c sonrası 7 bayt boşluk: 1 + 7 + 8 + 1 + 7 Doğru cevap
- Alanlar 8'er bayttır
Açıklama: b 8'e hizalı olmalı, toplam boyut da 8'in katı olmalı. Alanları b, a, c sırasıyla yazmak 16 bayta indirir.
2 Büyükten küçüğe
#[repr(C)]
struct Iyi {
____,
a: u8,
c: u8,
}
#[repr(C)]
struct Iyi {
b: u64,
a: u8,
c: u8,
}
Açıklama: En büyük hizalamalı alanı başa koymak boşluğu azaltır.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
repr(Rust) |
Serbest sıralama |
repr(C) |
Korunan sıra |
ZST |
Sıfır bayt |
Niche |
Ücretsiz Option |