Bu makalede sizlere Stack ve Heap’in ne olduğunu ve farklarını C++ örnekleriyle açıklayacağım ayrıca programımızın kullandığı diğer bellek kısımlarına da değineceğim.
Bellek Segmentleri Nelerdir?
İlk olarak programımız başlatıldığında programa verilen bellek(RAM), segment adındaki farklı alanlara ayrılır, Stack ve Heap de bu alanlar arasından en önemli olanları, elbette bu alanlar Stack ve heap ile kalmıyor, Stack ve Heap dışındaki alanları basitçe özet geçelim:
- Text/Code segment: Derlenmiş programımızın talimatlarının çalıştırılmak üzere kopyalanıldığı ve saklanıldığı yerdir.
- Bss segment(“block started by symbol.”): veri atanmamış veya sıfır ile başlatılmış global ve statik değişkenlerin saklanıldığı yerdir. bu segmentin bulunma sebepi programın boyutu ile ilgili optimizasyonlardır, sonuçta başlatılmasa da o değişkenlerin değeri “0”(sıfır) dır, bu yüzden binary’de bu segment için sadece boyutunun ne kadar olduğu gereklidir.
- Data segment: değeri verilip başlatılmış statik ve global değişkenlerin saklandığı yerdir.
Heap segmenti nedir?
Heap segmenti (“free store” olarak da bilinir) boyutu büyük veya belli olmayan verileri saklamak için kullanılan segment’dir (Büyük boyutlu arrayler, objeler…) çünkü Heap segmenti, Stack segmentinin aksine belirli bir boyutu yoktur yani boyutu genişleyebilir, değişebilir. ayrıca sakladığımız verinin yaşam süresini kontrol etmek istediğimiz zamanlarda kullanırız.
Heap de Stack’ın aksine ayırdığınız yer manuel olarak boşaltılması yani silinmesi gerek aksi taktirde memory leak durumu oluşur, memory leak‘i bir kiracının evinizde kalıp eşyalarını bırakıp gitmesi gibi düşünebilirsiniz, bu örnekte ev: bellek, eşya: veri.
Heap Segmenti Avantajları
- Boyut olarak sizi sınırlamaz.
- Heap de ayırdığın veriye erişim kısıtlı değildir yani veriyi silmediğiniz taktirde istediğiniz yerde ayırılan verinin saklanıldığı yerin adresi bulunduğu sürece o veriye erişebilirsiniz.
Heap Segmenti Dezavantajları
- Yönetimi nispeten zordur.
- Heap üzerinde yer ayırtmak Stack üzerinde yer ayırtmaktan nispeten yavaştır.
- C++ için konuşursak Heap’deki alana erişmek için pointer kullanmalıyız ve dereferance yapmak direk değişkene erişmekten daha yavaş çalışır.
Stack Veri Yapısı Nedir?
Stack segmenti verileri düzenlemek için ismini de aldığı Stack adındaki veri yapısını kullanır , bu yüzden Stack segmentini anlamadan ve öğrenmeden önce bu veri yapısını anlamak ve öğrenmek gerek.
Stack veri yapısı isminden de anlaşılacağı üzere (ENG stack -> TR yığın) yığın halinde kullanılır
Stack veri yapısını üst üste yığılmış kitaplar örneği ile düşünebilirsiniz sonuçta kitap yığınında istediğiniz bir kitabı düzgünce almak istiyorsanız o kitapın üstündeki kitapları da indirmeniz gerekir aynı stack veri yapısındaki gibi
Stack Segmenti Nedir?
Stack segmenti (“Call stack” da denir) programdaki aktif fonksiyonların Stack frame‘lerini üst üste yığın halinde saklar, fonksiyon bitince de o fonksiyonun Stack frame‘i Stack segmentinden çıkarılır (pop), Stack frame‘i Fonksiyonun parametrelerinin ve local(yerel) değişkenlerinin tümünü içerir.
örneğimize dönecek olursak Stack segmentini yığın halindeki Kitapların tümü olarak, Stack frame‘ini kitap olarak, Kitapın içindeki sayfaları da Fonksiyonun parametreleri, local değişkenleri…şeklinde düşünebiliriz.
Stack segmentinin kullanım boyutu aktif fonksiyonların(çağrılmış ve bitirilmemiş) sayısı arttıkça büyür ayrıca Stack segmentinin alanı Heap segmentin’e kıyasla farklı şekilde otomatik olarak CPU tarafından verimli bir şekilde yönetilir.
Stackoverflow nedir?
İlk duyuşunuzda aklınıza https://www.stackoverflow.com sitesi gelmiş olabilir ki sitenin ismi zaten buradan geliyor.
Stack’ın Heap’den bir farkı da önceden belirlenmiş bir boyutu olmasıdır, yani belirli miktarda veriyi tutabilir. Bu boyut windows’ta default olarak 1mb’dır, fakat bazı Unix sistemlerinde bu boyut 8mb’a kadar çıkabilir.
Eğer program Stack’a bu boyutun kaldırabileceğinden fazla veri koymaya çalışırsa Stackoverflow durumuyla karşılaşınır, bunu deneyebileceğiniz bir örnek kodla gösterelim, bu kodu çalıştırdığınız zaman programın çökmesi gerekmekte verilen Stack boyutunu aştığımız için
int main()
{
int stack[10000000];
}
Stack Avantajları
- Stack üzerinde yer ayırtmak Heap üzerinde yer ayırtmaktan nispeten hızlıdır.
- Yönetimi nispeten kolaydır
Stack Dezavantajları
- Boyutunun belirli bir sınırı olduğu için sizi sınırlar.
- O anki Stack frame’sinde ayırdığın yer o Stack frame’sinin içinden ve Stack de kaldığı süre boyunca kullanılabilir
C++ Stack ve Heap örnekleri
int main()
{ // Stack da main için bir frame push'landı
int stackArr[10];// main'in Stack Frame'sinde 10x4 byte lık bir alan ayırttık
} // main'in stack frame'si fonksiyon scope dışına çıktığından dolayı silindi (pop)
int main()
{
int* stackArr = new int[10];// Heap de 10x4 bytelık bir alan ayırttık
// Ayrıc heap de oluşturduğumuz alana erişebilmek için de Stack da bir pointer oluşturduk
} // Heap de oluşturduğumuz alan silinmedi manuel olarak silmek için C++ da delete keywordunu kullanmalıyız
Özet:
Boyutunun belli ve nispeten küçük olduğu verileri stack da, Boyutunun belli olmadığı ve nispeten büyük olduğu verileri de heap de saklamaya özen gösterin.
Son söz
Umarım size bugün bir şeyler katabilmişimdir. bu benim ilk yazım ve okuyup zaman ayıran herkese teşekkür ederim 😊
Ellerine Sağlık Bir Kaç Yazı Daha Bekliyoruz :hrr:
İnşallah başka yazılarım da gelecek
recep ivedik onaylı epik yazı 👍
Çok bilgilendirici ve güzel bir yazı olmuş.
Fikriniz için çok teşekkür ederim 🙂
Güzel yazmışın PyroSoft++ =)
Güzeeel