Stack vs Heap: Farkları Nedir?

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.


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 benzetmesi

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 veri yapısı çalışma şekli

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 😊


Beğendin mi? Arkadaşlarınla paylaş!

9
9 Puanlar
Efe Osman

7 Yorum

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir