CodeBlanks Logo Icon CodeBlanks

#[repr(C)]

#[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 bayt

Dü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));      // 8

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

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

Soru
#[____]
struct Paket {
    a: u8,
    b: u32,
}
Cevap
#[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

İleri seviye bölümündeki tüm dersler