Stack ve Heap Arasındaki Fark Nedir?

Heap ve stack farkı

Hangi programlama dilini kullanarak yazılım geliştiriyor olursanız olun duyacağınız iki terimdir Stack ve Heap. Bende bir Objective-C geliştiricisi olarak sıklıkla okuduğum makalelerde karşılaşıyorum. Veri Yapıları ve Algoritmaları isimli dersi almış ve çok sevmiş birisi olarak (şu ana kadar üniversitede görüp en sevdiğim dersti!)  bu iki terime de yabancı değildim. Ancak kendi kendime açıklama kısmında kafamda bazı karışıklar olduğunu fark ettim. Bu yazıda Stack ve Heap ikilisini kavramsal olarak açıklamanın ötesinde kodlama sırasında nasıl kullandığımızı örnekliyorum.

Anneye anlatır gibi: “Stack” ve “heap”

Kodumuz işletim sisteminde bir yer kaplar. Bu yerin boyutu kimi zaman belli yani değişmez iken kimi zaman ise kullanıcının program esnasında gireceği verilere göre değişebilecek durumdadır. Temel olarak bu farklılıktan dolayı iki farklı yöntemimiz var. Eğer program esnasında boyutları bildirilmiş değişmez bir değer kullanıyorsak stack, değişebilir bir değer kullanıyorsak heap bizim için uygun olacaktır. Stack ve heap kullanımları farklı ve dikkat edilmesi gereken bir konudur. Stack kullanılır ve işi bittikten sonra kendini otomatik olarak bellekten yok eder. Fakat heap‘de bu işi siz yapmalısınız. (Çünkü C’de Garbage Collector yok, ne olduğuna konunun özünü kaçırmamak için girmiyorum.)

Stack ve heap temel mantığına değinmek istediğim için örneklerimi C üzerinden veriyorum. Java, Objective-C gibi dillerde daha önemsiz bir konudan bahsediyoruz. İstek gelirse bu dillerin özelinde de bir yazı paylaşabilirim.

Örnek;

 

Örneğimizde “fonksiyon()” isminde bir fonksiyon tanımladık. Bu fonksiyonun içerisinde ayrılan boyut fonksiyonun işi bittiğinde işletim sistemine geri iade edilmelidir. Stack bunu otomatik olarak yaparken Heap‘te manuel olarak kodumuzla yapmalıydık 🙁

Kısaca kodda “Abi bana 20 tane araba markası söyle aklımda tutayım.” diyorsanız bilgisayarınızın hafızası stack gibi çalışır. 20’den fazla arabayı aklınızda tutamazsınız. “Abi istediğin kadar araba markası söyle” derseniz bu sefer hafıza heap gibidir. Hepsini hatırlar ama unutma zamanını bilmelidir yoksa beyni yanar.

First-in-last-out gibi yazıyı okuduktan sonra hangisi nasıl çalışıyordu hatırlamakta zorlanacağınız konulara girmek istemiyorum. Aşağıda karşılaştırmasını da yapıp lafı uzatmadan bitiriyorum.

Stack:

  • Stack candır. Kullanımı kolaydır. Eğer çömezseniz en yakın arkadaşınızdır.
  • Bilgisayarda RAM’de tutulur. Tıpkı Heap gibi.
  • Oluşturulan değişkinler stack kapsamından çıkınca otomatik olarak yok edilir.
  • Ulaşılması heap‘e göre oldukça hızlıdır.
  • Stack üzerinde kullanım fazla olduğunda alan yeterli olmayabilir. Mesela 20 boyutlu bir diziye 21 eleman atamak gibi…
  • Oluşturulan değişkenler pointer olmadan kullanılabilir.
  • Derleme zamanında oluşturulur.
  • Kullanacağınız yerin boyutunu tam olarak biliyorsanız Stack‘i kullanmak sizin için uygun olacaktır.

Heap:

  • Heap biraz nazlıdır. Ama nazını çekerseniz oda sizin yükünüzü çeker.
  • Bilgisayarda RAM’de tutulur.Tıpkı Stack gibi.
  • Bir blok içerisinde oluşturulan heap değişkenler, bloğun dışına çıktığında otomatik olarak yok edilemez, bunun manuel olarak yapılması gerekir.
  • Stack ile karşılaştırıldığında oldukça yavaştır.
  • Doğru kullanılmaması durumunda bellek sorunları yaratır.
  • Değişkenler pointer ile kullanılır.
  • Çalışma zamanında oluşturulur.
  • İhtiyacınız olan boyutu tam olarak bilmiyorsanız Heap kullanımı sizin için biçilmiş kaftandır.

Fun time is over.

Kaynaklar:

  1. http://www.programmerinterview.com/index.php/data-structures/difference-between-stack-and-heap/
  2. http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap
  3. http://stackoverflow.com/questions/4326965/objective-c-memory-allocation-on-stack-vs-heap

“Stack ve Heap Arasındaki Fark Nedir?” için 1 yorum

  1. Ellerine sağlık 🙂 Vaktin olursa kafa karıştıran kısmını da bu güzel üslübunla yazmanı bekleriz 🙂

Bir Cevap Yazın

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