CodeBlanks Logo Icon CodeBlanks

#[inline]

#[inline] attribute'unu ve etkilerini öğrenirsin.

#[inline]

Satır içi alma (inlining), çağrıyı fonksiyon gövdesiyle değiştirir; çağrı maliyeti kalkar ve sonraki optimizasyonların yolu açılır. Derleyici bunu crate içinde kendisi karar verir. Öznitelikler ipucu verir:

#[inline]          // crate dışında da satır içi alınabilsin
pub fn kare(x: i32) -> i32 { x * x }

#[inline(always)]  // güçlü istek (garanti değil)
fn sicak(x: u8) -> u8 { x ^ 0x55 }

#[inline(never)]   // profilde ayrı görünsün, kod küçük kalsın
fn soguk_yol() { .. }

Generic fonksiyonlar zaten her crate'te yeniden derlendiği için onlara #[inline] gerekmez.

Sıcak ve soğuk yollar

Nadiren çalışan hata yollarını ayrı bir fonksiyona çıkarıp #[cold] ve #[inline(never)] ile işaretlemek, sık çalışan yolu küçük ve hızlı tutar:

#[cold]
#[inline(never)]
fn tasma_hatasi(i: usize) -> ! {
    panic!("indeks {i} sınır dışında")
}

fn al(v: &[u32], i: usize) -> u32 {
    if i >= v.len() { tasma_hatasi(i) }
    v[i]
}

! (never türü) fonksiyonun hiç dönmediğini söyler.

Uygulama Satır içi ipuçları

#[inline] fn kare(x: i32) -> i32 ve #[inline(never)] fn kup(x: i32) -> i32 yaz. kare(3) + kup(2) sonucunu yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
#[inline]
fn kare(x: i32) -> i32 {
    x * x
}

#[inline(never)]
fn kup(x: i32) -> i32 {
    x * x * x
}

fn main() {
    println!("{}", kare(3) + kup(2));
}

Beklenen çıktı

17

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Her fonksiyona <code>#[inline(always)]</code> eklemek neden kötü bir fikirdir?

  • Güvensizdir
  • Kod büyür, talimat önbelleği taşar ve program yavaşlayabilir Doğru cevap
  • Derlenmez
  • Bir etkisi yoktur

Açıklama: Satır içi alma bir ödünleşimdir; derleyicinin sezgileri çoğu zaman iyidir. Profil göstermeden zorlama.

2 Satır içi alma ipucu

Soru
#[____]
pub fn kare(x: i32) -> i32 {
    x * x
}
Cevap
#[inline]
pub fn kare(x: i32) -> i32 {
    x * x
}

Açıklama: #[inline], fonksiyonun crate dışında da satır içi alınabilmesini sağlar.

3 Öznitelik ve amacı

Kavram Anlamı
#[inline] Crate dışı satır içi
#[inline(always)] Güçlü istek
#[inline(never)] Asla satır içi
#[cold] Nadir yol

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