Smart Pointers (101): Box<T> ile Heap Üzerinde Veri Saklama

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18
Rust'ta değişkenlerin çoğu varsayılan olarak Stack (yığın) üzerinde saklanır. Ancak bazen verinin boyutunu derleme anında bilemeyiz veya sahipliği belirli kurallar çerçevesinde yönetmemiz gerekir. İşte bu noktada Smart Pointers (Akıllı İşaretçiler) devreye girer.
Bu serinin ilk ve en temel akıllı işaretçisi Box<T>'dir.

1. Box<T> Nedir?​

Box<T>, veriyi Stack yerine Heap (öbek) üzerinde saklamanızı sağlar. Stack üzerinde sadece Heap'teki veriyi işaret eden bir pointer (işaretçi) tutulur.
Temel Özellikleri:
  • Sahiplik: Box, işaret ettiği verinin sahibidir. Box kapsam dışına çıktığında, Heap'teki veri de temizlenir.
  • Performans: Sadece bir pointer kopyalandığı için büyük verileri taşırken (move) performans avantajı sağlar.
  • Boyut Belirleme: Derleme anında boyutu bilinmeyen tiplerin boyutunun netleşmesini sağlar.

2. Ne Zaman Box<T> Kullanmalıyız?​

Box<T> kullanmanın üç ana senaryosu vardır:

A. Boyutu Derleme Anında Bilinmeyen Tipler (Recursive Types)​

Rust, bir tipin ne kadar yer kaplayacağını derleme anında bilmek ister. Ancak bir tip kendisini içeriyorsa (örneğin bir Linked List düğümü), bu sonsuz bir boyut oluşturur. Box kullanarak bu döngüyü kırabiliriz.
Rust
Kod:
// Hatalı: Derleyici boyutunu hesaplayamaz
// enum List { Cons(i32, List), Nil } 

// Doğru: Box bir pointer olduğu için boyutu sabittir
enum List {
    Cons(i32, Box<List>),
    Nil,
}

B. Büyük Veri Yığınlarını Transfer Etmek​

Çok büyük bir struct'ınız olduğunu düşünün. Bunu bir fonksiyona parametre olarak gönderdiğinizde (move), tüm veri stack üzerinde kopyalanabilir. Eğer veri Box içindeyse, sadece küçük bir pointer taşınır.

C. Trait Objects (Polimorfizm)​

Belirli bir tipi değil, sadece belirli bir Trait'i uygulayan "herhangi bir tipi" saklamak istiyorsanız Box<dyn Trait> kullanırsınız.

3. Box<T> Nasıl Kullanılır?​

Kullanımı oldukça basittir; Box::new ile veriyi paketlersiniz.
Rust
Kod:
fn main() {
    // 5 değerini Heap'e koyarız
    let b = Box::new(5);
    
    println!("b = {}", b);
    
    // Dereferencing (İçindeki değere erişim)
    let toplam = *b + 10; 
} // b burada kapsam dışına çıkar ve hem stack'teki pointer hem heap'teki 5 silinir.

4. Deref ve Drop Trait'leri​

Akıllı işaretçileri "akıllı" yapan iki önemli Trait vardır:
  • Deref: Box'ın bir referans gibi davranmasını sağlar (* operatörü ile içeriğe erişim).
  • Drop: Veri kapsam dışına çıktığında otomatik temizlik yapılmasını sağlar.

Özet​

ÖzellikDetay
KonumVeri Heap'te, Pointer Stack'te.
MaliyetHeap tahsisi (allocation) nedeniyle çok küçük bir performans yükü.
En Yaygın KullanımRecursive yapılar (Tree, List) ve Trait Objects.
 
Geri
Üst