Stack, örneğin bir derleyicide yer alan program kodlarının parantezlemelerini depolayan bellek bölümüdür. Derleyici kodu derlerken açılan parantezleri ve onun akabinde kapatılan parantezleri stack'e atar(push) ve sırayla bunları kontrollü bir şekilde tepeden aşağıya doğru(LIFO methodu doğrultusunda) stack'ten çıkarır(pop). Eğer bir eksiklik yakalanırsa derleyici demek ki parantez eksiği var der ve ona göre hata verir. Stack'in kullanımı ile alakalı bir diğer örnek ise bir programın kodunda yer alan fonksiyonların çalışma işleyişidir. Örneğin C dilinde yazılmış bir program, çalışmaya main fonksiyonunda başlar ve main fonksiyonunda biter. Main fonksiyonu içerisinde kullanılan bir başka fonksiyon çağırılırken program, fonksiyon nerede tanımlanmışsa oraya dallanır. Stack ise bu örnekte geri dönüş adresini tutma işlevini yerine getirir. Yani programın dallandığı fonksiyonun işlenmesi bittikten sonra eski yere dönüş adresi stack'te depolanır.

Peki heap nedir? Bunu açıklamadan önce bir analojiye değinmemiz anlamamızı kolaylaştıracaktır. RAM belleği bir defter olarak düşünün. Bir yazı yazmaya başlarken defterin başından başlarız, değil mi? Program kodlarımız program çalıştırıldığında defterin(RAM'in) başından itibaren yazılmaya başlar. Stack ise defterin sonudur. Genelde defterin sonuna bazı notlar alır ve sayfa dolduktan sonra bir önceki sayfaya kayarız, değil mi? Stack de bunu yapar. Sondan başa doğru yerleştirir. Heap ise şudur: Diyelim ki masaüstündeki bir programın simgesine(kısayoluna) çift tıkladınız. Çift tıklama sonucu o programın makine kodu CPU'nun Kontrol Birimi(Control Unit'i) tarafından hard disk'ten RAM'e kopyalanır. Bu kopya veri, belleğin başından itibaren birer birer hücrelere yerleştirilir(defterin başından itibaren yazılır). Stack ise yukarıda bahsettiğimiz gibi çeşitli ilgili durumlarda verileri, belleğin en sonundaki hücrelere birer birer yerleştirir(defterin sonuna notlar alınır). Heap ise defterde yazının bittiği sayfa ile en arka sayfadaki notların bittiği yere kadarki olan kısma denir. Bir başka şekilde ifade edecek olursak heap, program kodları ile stack'in arasında kalan yere denir.
Stack ile heap arasındaki farka gelecek olursak bunların birinci farkı bellekte farklı yerleri ifade ediyor olmalarıdır. İkinci farkı ise şudur ki heap, stack'ten farklı bir kullanım amacına sahiptir. O da bir programın çalıştığı sıralar bellekten yer talep edildiği durumlarda talebin heap'ten isteniyor olmasıdır. Yani heap'e aslında dinamik bellektir diyebiliriz. Anlamadığınızı varsayarak yine bir örnek ile açıklamaya çalışayım: C'de listelerle alakalı bir program yazdığınızı düşünün. Ve programın algoritmasını kullanıcının girdiği sayı oranında liste düğümü olacak şekilde ayarladığınızı varsayın. Bu durumda program çalışırken kullanıcının girdiği sayı kadar malloc() fonksiyonu çalıştırılacak ve o kadar bellek alanı talebinde bulunulacaktır. İşte bu talepler sonucu cevap olarak dönen alan tahsisinin yapıldığı yer heap'tir. Heap'in zaman zaman dinamik bellek olarak adlandırılmasının nedeni de budur. Stack de istif bellek olarak adlandırılabilir.
Bu kavramların anlaşılması yazdığımız kodun arka planda neler yaptığı hakkında bize bilgiler verir. Stack ve Heap ‘i açıklarken belleğin nasıl yönetildiği, nasıl kullanıldığı hakkında fikir edinmiş olacağız.
Stack belleği uzun bir kutu şeklinde düşünebiliriz. Yeni bir nesne eklemek istediğimizde, bu nesne en üstte olacak şekilde sıralanır. En alttaki nesneye ulaşmak için en üstteki nesneleri tek tek çıkarmamız gerekir. Basittir.
Heap belleği ise geniş bir oda şeklinde düşünelim. Boş bulduğumuz her yere bir nesne yerleştirebiliriz ve istediğimiz bir nesneyi de istediğimiz anda alabiliriz. Tabiki geniş bir odada istediğimiz nesneyi aramak vakit alan bir işlemdir. Komplekstir.
Aradaki farklara maddeler halinde göz atacak olursak:
Stack
- LIFO prensibine göre çalışır. (Last In First Out). Yani son gelen ilk olarak çıkar. Bunu bir kutu gibi düşünmüştük. Kutuya bir kitap eklemek istediğimizde en üste ekleriz. Kutudan bir kitap çıkarmak istiyorsak en üstteki kitabı alıp çıkarırız. En alttaki kitabı çıkarmak için bütün kitapları tek tek çıkarmamız lazım.
- Her bir thread (iş parçacığı) için bir tane stack bellek oluşturulur.
- Maksimum boyutu thread oluşturulurken ayarlanır.
- Stack, daha hızlıdır. Çünkü çalışma prensibi çok basittir ve ulaşılmak istenen veriler ve boş alanlar ardarda sıralanmış olur.
- Bu kısımda oluşturulmuş veriler için pointer kullanımına gerek yoktur.
- Lokal değişkenler ve metotlar bu kısıma bağlıdır.
Heap
- İçindekiler karışık bir şekilde sıralanmıştır. Bunu da oda gibi düşünmüştük.
- Heap bellek, uygulama başlatıldığında başlar. Ortak olarak kullanılır. Stack gibi her bir thread için ayrı bir tane oluşturulmaz. Bir process için bir heap oluşturulur diyebiliriz.
- Stack belleğe göre daha yavaştır. Nedeni ise herhangi bir nesneye ulaşmak için kompleks bir arama yapmanız gerekir. Bir nesneyi boş bulduğumuz herhangi bir yere koyabiliriz. Karmaşıktır.
- “Memory Leaks” , “Fragmentation” bu kısımda ortaya çıkar.
- Yer sorunu olduğu zaman işletim sisteminden daha fazla yer isteyebilir. Yani genişleyebilir.
- · Instance değişkenleri ve objeler bu bölgeye bağlıdır.