CodeBlanks Logo Icon CodeBlanks

Özet - Bellek düzeni

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şluk

Clippy'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

main.rs
use std::mem::size_of;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
#![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

Soru
#[repr(C)]
struct Iyi {
    ____,
    a: u8,
    c: u8,
}
Cevap
#[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

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