Bilgisayar biliminin temelinde yer teşkil ettiğinden hangi teknolojiyi kullanarak yazılım geliştiriyor olursanız olun duyacağınız iki terimdir Stack ve Heap. Ben de bir iOS 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 ve hafızamda daha kalıcı bir yer tutması için bu yazıyı ortaya çıkardım. Stack ve Heap ikilisini kavramsal olarak açıklamanın ötesinde kodlama sırasında nasıl kullandığımızı örnekliyorum.
ANNEYE ANLATIR GİBİ: “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‘te 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 daha alt seviye bir dil olan C üzerinden veriyorum. Swift, Objective-C gibi Automatic Reference Counting’e sahip mimarilerde bu konu derleyici tarafından otomatize edilmiş durumda.
Örnek kod parçacığımıza gelecek olursak:
void fonksiyon()
{
//Henuz kullanmadigimiz pointer(Su an stack'de duruyor).
char *araba_ismi;
// Stack'te yer ayirilan bool deger.
boolean b = true;
if(b)
{
//Stack uzerinde 20 byte yer ayrildi.
char araba_markasi[20]; //Heap uzerinde yer ayrildi.
araba_ismi = new char[];} //<- araba_markasi burada bellekten silindi ama araba_ismi hala
duruyor.
} //<- Burada bir bellek problemi oluşacak, araba_ismi değişkenini
free(araba_ismi) yazılması gerekiyordu
Örneğimizde “fonksiyon()” isminde bir fonksiyon tanımladık. Bu fonksiyonun içerisinde ayrılan hafızada 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.
- 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.
Bu içeriğin yararlı olduğunu düşünüyorsanız 👏🏻 butonuna tıklayarak destek olabilir, soru ve fikirlerinizi Twitter’dan paylaşabilirsiniz:
Yigit Yilmaz (@ThisYigit) | Twitter
The latest Tweets from Yigit Yilmaz (@ThisYigit). iOS developer @wearethreadco
twitter.com
Kaynak: