#[repr(C)] ve #[repr(Rust)]
- Rust kursu
- Uzman
- Ders 8/46
- 4 dk
#[repr(C)] ve #[repr(Rust)] farkını öğrenirsin.
#[repr(C)] ve #[repr(Rust)]
repr öznitelikleri düzen üzerinde açık sözleşme kurar:
repr(Rust): varsayılan; derleyici serbest.repr(C): C ile uyumlu, alan sırası korunur.repr(u8)/repr(i32): enum'un ayırt edici türünü sabitler.repr(transparent): tek alanlı sarmalayıcının içteki türle aynı ABI'ye sahip olmasını garanti eder.repr(packed)/repr(align(n)): boşluğu kaldırır ya da hizalamayı büyütür.
#[repr(u8)]
enum Renk { Kirmizi = 1, Yesil = 2 } // 1 bayt
#[repr(transparent)]
struct Metre(f64); // f64 ile aynıNe zaman hangisi?
repr(C): FFI ve ikili biçimler. repr(u8): enum'u bir bayt olarak saklamak ya da C enum'u ile eşlemek. repr(transparent): newtype'ı FFI'da içteki tür yerine geçirmek. repr(align(64)): iki thread'in aynı önbellek satırını paylaşmasını (false sharing) önlemek. repr(packed): yalnızca zorunlu ikili düzenler için; performans ve güvenlik bedeli vardır.
#[repr(align(64))]
struct Sayac(std::sync::atomic::AtomicU64); // her sayaç kendi önbellek satırındaUygulama repr öznitelikleri
#[repr(u8)] enum Renk { Kirmizi = 1, Yesil = 2 } ve #[repr(transparent)] struct Metre(f64); tanımla. size_of::<Renk>(), Renk::Yesil as u8 ve size_of::<Metre>() değerlerini boşlukla yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
#![allow(dead_code)]
use std::mem::size_of;
#[repr(u8)]
enum Renk {
Kirmizi = 1,
Yesil = 2,
}
#[repr(transparent)]
struct Metre(f64);
fn main() {
println!("{} {} {}", size_of::<Renk>(), Renk::Yesil as u8, size_of::<Metre>());
}Beklenen çıktı
1 2 8
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>repr(packed)</code> struct'ın bir alanına referans almak neden sorunludur?
- Sorun değildir
- Boyut değişir
- Alan hizasız olabilir; hizasız referans tanımsız davranıştır Doğru cevap
- Alanlar gizlidir
Açıklama: Derleyici bu yüzden packed alanlara referansı hata sayar; değer kopyalanarak ya da addr_of! ve read_unaligned ile okunur.
2 Şeffaf sarmalayıcı
#[repr(____)]
struct Metre(f64);
#[repr(transparent)]
struct Metre(f64);
Açıklama: repr(transparent) sarmalayıcının içteki türle aynı ABI'ye sahip olmasını sağlar.
3 repr ve etkisi
| Kavram | Anlamı |
|---|---|
repr(C) |
C uyumlu düzen |
repr(u8) |
1 baytlık ayırt edici |
repr(transparent) |
İçteki türle aynı ABI |
repr(align(64)) |
64 bayt hizalama |