#[repr(C)]
- Rust kursu
- İleri seviye
- Ders 37/81
- 4 dk
#[repr(C)] ile C uyumlu struct tanımlarsın.
#[repr(C)]
Rust, struct alanlarının bellekteki sırasını ve boşluklarını (padding) değiştirmekte serbesttir; genellikle alanları yer kazanmak için yeniden sıralar. C'ye geçirilecek struct'larda düzen C'ninkiyle aynı olmalıdır. #[repr(C)] alanları yazıldığı sırayla ve C kurallarıyla yerleştirir:
#[repr(C)]
struct Paket {
a: u8, // 1 bayt + 3 boşluk
b: u32, // 4 bayt
c: u8, // 1 bayt + 3 boşluk
} // toplam 12 bayt
struct Serbest { a: u8, b: u32, c: u8 } // Rust yeniden sıralar: 8 baytDüzeni ölçmek
size_of ve align_of düzeni derleme anında verir; std::mem::offset_of! bir alanın başlangıçtan uzaklığını gösterir:
use std::mem::{align_of, offset_of, size_of};
println!("{}", size_of::<Paket>()); // 12
println!("{}", align_of::<Paket>()); // 4
println!("{}", offset_of!(Paket, b)); // 4
println!("{}", offset_of!(Paket, c)); // 8Enum'lar için #[repr(u8)] ya da #[repr(C)], ayırt edici değerin türünü ve düzenini sabitler.
Uygulama Düzen karşılaştırması
Aynı alanlara (a: u8, b: u32, c: u8) sahip #[repr(C)] struct Paket ve düz struct Serbest tanımla. İ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 Paket {
a: u8,
b: u32,
c: u8,
}
struct Serbest {
a: u8,
b: u32,
c: u8,
}
fn main() {
println!("{} {}", size_of::<Paket>(), size_of::<Serbest>());
}Beklenen çıktı
12 8
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Neden u32 alanından önce 3 bayt boşluk eklenir?
- u32'nin adresi 4'ün katı olmalıdır (hizalama) Doğru cevap
- C kuralı değildir
- Hız için rastgele
- Eklenmez
Açıklama: Her tür kendi hizalamasının katı olan bir adreste durmalıdır; struct'ın boyutu da en büyük hizalamanın katına yuvarlanır.
2 C düzeni
#[____]
struct Paket {
a: u8,
b: u32,
}
#[repr(C)]
struct Paket {
a: u8,
b: u32,
}
Açıklama: repr(C) alanları C kurallarıyla, yazıldığı sırada yerleştirir.
3 İfade ve sonuç (Paket)
| Kavram | Anlamı |
|---|---|
size_of::<Paket>() |
12 |
align_of::<Paket>() |
4 |
offset_of!(Paket, b) |
4 (offset) |
size_of::<Serbest>() |
8 |