Program Belleğinin Gözden Geçirilmesi
Programlar iki şekilde bellek tahsis eder (allocate):
-
Yığın (Stack): Yerel değişkenler için sürekli olan bir bellek alanı.
- Değerlerin derleme zamanında (compile time) bilinen sabit boyutları (fixed size) vardır.
- Son derece hızlı: sadece bir yığın göstericisi (stack pointer) yeni bir değer alır.
- Yönetimi kolay: fonksiyon çağrılarını izler (fonksiyon nereden çağrıldı bilgisinin kaydı).
- Mükemmel bellek yerelliği (memory locality) sağlar (önbellek durumları için).
-
Dinamik Bellek (Heap): Fonksiyon çağrıları dışındaki değerlerin depolanması.
- Bazı değerlerin çalışma zamanında belirlenen dinamik boyutları vardır.
- Yığından (stack) biraz daha yavaş: bazı yönetim işlemleri (bookkeeping) gerekir.
- Bellek yerelliği garantisi yoktur.
Örnek
Bir String oluşturmak, yığına (stack) sabit boyutlu üst veri (metadata) ve dinamik belleğe (heap) ise gerçek dizeyi (string) tutan dinamik boyutlu verileri koyar:
fn main() { let s1 = String::from("Merhaba"); }
-
Bir
String’in aslında birVeckullandığını, bu nedenle bir kapasitesi ve uzunluğu olduğunu ve değiştirilebilir (mutable) ise dinamik bellekte (heap) yeniden tahsis (reallocation) yoluyla büyüyebileceğini belirtin. -
Öğrenciler sorarsa, temel belleğin (underlying memory) Sistem Tahsis Edicisi (System Allocator) kullanılarak dinamik bellekten (heap) tahsis edildiğini ve özel bellek tahsis edicilerin (custom allocators) Tahsis Edici API’si (Allocator API) kullanılarak gerçekleştirilebileceğini belirtebilirsiniz.
Daha Fazlasını Keşfedin
Bellek düzenini (memory layout) unsafe Rust ile inceleyebiliriz. Ancak, bunun haklı olarak emniyetsiz (unsafe) olduğuna dikkat etmelisiniz!
fn main() { let mut s1 = String::from("Merhaba"); s1.push(' '); s1.push_str("dünya"); // BUNU EVDE DENEMEYİN! Sadece eğitim amaçlıdır. // String, düzeni hakkında hiçbir garanti vermez, bu nedenle bu // tanımsız davranışa (undefined behavior) yol açabilir. unsafe { let (capacity, ptr, len): (usize, usize, usize) = std::mem::transmute(s1); println!("kapasite = {capacity}, ptr = {ptr:#x}, uzunluk = {len}"); } }