Heap ve Stack: Bellek Birimlerine Genel Bakış
- 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.
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:
-
Ritchie, D.M. ve Kernighan, B.W. 1988. The C Programming Language. Prentice-Hall, Chapter 5, 7, 8 and Appendix B.5
-
Gribble, P. (2012). Memory: Stack vs Heap. Summer 2012, University of Western from https://gribblelab.org/CBootCamp/7_Memory_Stack_vs_Heap.html