Categories: .NET

Stack & Heap Kavramları

Merhaba arkadaşlar.

Stack ve Heap kavramlarından kısaca bahsetmek gerekirse, ram’in mantıksal bölümleridir diyebiliriz. Stack’de değer tipleri, pointer ve adresler saklanırken, Heap’de ise referans değerleri saklanmaktadır.

Stack’e erişim Heap’den daha hızlıdır ve Stack, LIFO (Last-In-First-Out) mantığında çalışmaktadır. Yani son gelen ilk olarak çıkar. Bu sebep ile aradan herhangi bir eleman çıkartamazsınız, birbirleri ile ilişki içerisindedirler.

Struct tipindeki değişkenler değer tipleridir ve Stack içerisinde saklanmaktadır. Class tipindeki değişkenler ise referans tipleridir ve referansları Stack’de kendisi ise Heap’de saklanır.

 

 

Örneğin yukarıdaki şekilde görüldüğü üzere Int değer tipinde olduğu için direk Stack üzerinde “000001” adresine yerleştirilmiştir. String ise referans tipinden bir değişken olduğu için Stack üzerinde “00000H” adresinde ve “FFF0GH” olarak referans adresi tutulmuştur.

Stack & Heap’in genel özelliklerine kısaca bir bacak olursak;

  • Stack ve Heap ram’in mantıksal bölümleridir.
  • Stack LIFO mantığında çalışır. Yani son gelen ilk olarak çıkar.
  • Stack’de değer tipleri, pointer ve adresler saklanırken Heap’de ise referans değerleri saklanır.
  • Stack daha hızlıdır. Ulaşılmak istenen veriler ard arda sıralanmış olur.
  • Heap ortak olarak kullanılır ve uygulama başlatıldığında başlar.

NOT:  ref anahlar kelimesi ile bir method’a değer tipi dahi yollasak, (yukarıda bahsettik değer tipleri Stack üzerinde tutulmaktadır) söz konusu değişkenin içeriğini Stack bölgesinden Heap bölgeye aktarır ve adresini ise Stack bölgesindeki alanına yazar.

Gökhan Gökalp

View Comments

  • "ref anahlar kelimesi ile bir metota değer tipi dahi yollasak (Yukarıda bahsettik değer tipleri Stack üzerinde tutuluyor) söz konusu değişkenin içeriğini Stack bölgesinden Heap bölgeye aktarır "
    peki heap de de int olarak mı tutulur yoksa başka bir değişkende mi tutulur

  • Merhaba,
    Yazı için teşekkürler ancak benim anlamadığım kısım kod yazarken bunun benim ne işime yarayacağı? Benim okul isminde class ım olsun. Diyelim ki bana da zaten class lazım olsun. Şimdi yukarıdaki yazıya göre bu heapte tutulacak. Sonuçta ben "heap i çok kullandım stack e yüklenmeliyim" diyemiyorum ki? class ı stack e yazdırma şansım yok? kod yazarken burada neye dikkat ediyorsunuz?

    • Merhaba stack & heap kavramları aslında daha çok c, c++ gibi dillerde memory management adına çok önemlidir. JAVA ve C# gibi dillerde ise daha çok bizim işimizi Garbage Collector'ler üstlenmektedir. Burada arkaplanda ne olup bittiğini öğrenmek, bazı durumlarda bizlere fayda sağlayacaktır. Immutable tiplerden örneğin en çok tartışılan string vs stringbuilder memory performansı gibi. Birde boxing&unboxing konuları. Hoş, framework'ler artık bu durumları kendileri de yönetmeye başladı.

      • Bu bilgiler çok iyi elinize sağlık. Bu bilgilerin nezmn lazım olacağını yeri gelince farkedecek arkadaşlar. Bu bilgiler arasalarda cevabı bulması ve bukadar açık bir şekilde türkçe olarak bulması gerçekten çok çok zor... Süper yazılar blog u yeni gördüm artık takıipçiyim..

        • Haklısınız, zamanla bazı şeyleri problem edinmeye başladıkça insan araştırmaya ve derinlere inmeye başlıyor. :) Teşekkürler güzel yorumunuz için.

  • Programlamada yeniyim fakat sadece merak ettiğim için yaklaşık 2-3 gündür bu bilgiyi arıyordum. Bu konuyu sade ve anlaşılır bir biçimde bizimle paylaştığınız için teşekkür ederim. İyi çalışmalar.

      • Bu konuya paralel olarak aynı anlatımla ve şekillerle ref ve out parametrelerinden bahsetmek istiyor musunuz hocam? Kaç gündür bakıyorum ref ve out parametrelerinin mantığı bir türlü oturmadı. İyi çalışmalar.

    • Aslında cevap değişir, eğer heap'de saklanan bir alana erişmek için pointer oluşturdu iseniz, stack'de saklanır.

Recent Posts

Overcoming Event Size Limits with the Conditional Claim-Check Pattern in Event-Driven Architectures

{:en}In today’s technological age, we typically build our application solutions on event-driven architecture in order…

2 months ago

Securing the Supply Chain of Containerized Applications to Reduce Security Risks (Policy Enforcement-Automated Governance with OPA Gatekeeper and Ratify) – Part 2

{:tr} Makalenin ilk bölümünde, Software Supply Chain güvenliğinin öneminden ve containerized uygulamaların güvenlik risklerini azaltabilmek…

7 months ago

Securing the Supply Chain of Containerized Applications to Reduce Security Risks (Security Scanning, SBOMs, Signing&Verifying Artifacts) – Part 1

{:tr}Bildiğimiz gibi modern yazılım geliştirme ortamında containerization'ın benimsenmesi, uygulamaların oluşturulma ve dağıtılma şekillerini oldukça değiştirdi.…

9 months ago

Delegating Identity & Access Management to Azure AD B2C and Integrating with .NET

{:tr}Bildiğimiz gibi bir ürün geliştirirken olabildiğince farklı cloud çözümlerinden faydalanmak, harcanacak zaman ve karmaşıklığın yanı…

1 year ago

How to Order Events in Microservices by Using Azure Service Bus (FIFO Consumers)

{:tr}Bazen bazı senaryolar vardır karmaşıklığını veya eksi yanlarını bildiğimiz halde implemente etmekten kaçamadığımız veya implemente…

2 years ago

Providing Atomicity for Eventual Consistency with Outbox Pattern in .NET Microservices

{:tr}Bildiğimiz gibi microservice architecture'ına adapte olmanın bir çok artı noktası olduğu gibi, maalesef getirdiği bazı…

2 years ago