• Stack

stack, bilgisayar hafızasının özel bir bölümüdür. Bilgisayar tarafından kontrol edir yani otomatiktir ve programcı bu alana manuel olarak müdahale etmesi gerekmez. main() fonksiyonu dahil fonksiyonların ürettiği geçici değerler tutulur. LIFO (last in, first out) veri yapısına sahiptir.

Fonksiyonların stack bölgesine eklediği veya çıkardığı geçici değişkenler ölçüsünde stack bölgesi, genişler veya daralır. Değişkenler otomatik olarak tahsis edilir ve serbest bırakılır. İşletim sistemine bağlı olarak boyut sınırlara sahiptir. Stack değişkenleri, onları oluşturan fonksiyonlar hayatta olduğu sürece vardır.

  • Heap

heap, bilgisayarın hafızasının otomatik olarak yönetilmediği bölümüdür. Heap bölümünde bellek tahsisi için malloc, calloc veya realloc fonksiyonları çağırılmalıdır. Tahsis edilen bellek ünitesi yine manuel olarak free ile serbest bırakılması gerekir. Bu işlemler programcının sorumluluğundadır. Eğer bir hata çıkarsa buna memory leak denir.

Stack bölümünün aksine heap bölümünde değişkenler üzerinde (fiziksel sınırlar dışında) bir sınırlama yoktur. Heap bölgesi çok az da olsa stack bölgesine göre daha yavaştır çünkü heap bölgesine erişim için pointer’lara ihtiyacınız vardır.

Stack bölgesinin aksine heap bölgesinde oluşturulan değişkenler programdaki herhangi bir fonksiyon tarafından erişilebilir. Heap değişkenleri esasında global değişkenlerdir. Heap, kendi bölgesinin en etkili bir biçimde kullanıldığını garanti etmez.


heap_stack


Stack – Heap Kullanım Alanları

Eğer hafızada büyük yer kaplayacak veri yapıları kullanacaksanız (mesela büyük diziler veya geniş struct yapıları) bu verileri uzun süre tutmak gerektiğinden heap üzerinde tutmak daha mantıklıdır.

Eğer sadece ilgili fonksiyon çalışırken kullanmamız gereken değişkenlere sahipsek bunları stack bölümünde tutabiliriz (bu daha hızlı ve basit olur).

Eğer diziler ve struct yapıları gibi boyutları değişmesi muhtemel olan yapılar kullanılacak ise bunları heap bölümünde tahsis etmeli ve dinamik bellek tahsisini manuel olarak yönetmemizi sağlayan malloc, calloc, realloc ve free fonksiyonlarını kullanmamız gerekir.



2019 güz döneminde hazırladığım dönem sonu bitirme projesinden alıntılanmıştır. Kaynaklar: