CodeBlanks Logo Icon CodeBlanks

#[repr(C)] ve #[repr(Rust)]

#[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ında

Uygulama 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

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

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

Soru
#[repr(____)]
struct Metre(f64);
Cevap
#[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

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