Kısacası
Statik bellek ayırma için bir yığın ve her ikisi de bilgisayarın RAM'inde depolanan dinamik bellek ayırma için bir yığın kullanılır.
Detayda
Yığın
Yığın, CPU tarafından oldukça yakından yönetilen ve optimize edilen bir "LIFO" (son giren ilk çıkar) veri yapısıdır. Bir işlev her yeni değişkeni bildirdiğinde, yığına "itilir". Daha sonra bir işlev her çıktığında, o işlev tarafından yığına itilen tüm değişkenler serbest bırakılır (yani, silinirler). Bir yığın değişkeni serbest bırakıldıktan sonra, o bellek bölgesi diğer yığın değişkenleri için kullanılabilir hale gelir.
Yığını değişkenleri depolamak için kullanmanın avantajı, belleğin sizin için yönetilmesidir. Belleği elle ayırmanız veya artık ihtiyacınız olmadığında boşaltmanız gerekmez. Dahası, CPU yığın belleğini çok verimli bir şekilde düzenlediğinden, yığın değişkenlerinden okuma ve yazma değişkenlerine yazma çok hızlıdır.
Daha fazlasını burada bulabilirsiniz .
Öbek
Yığın, bilgisayarınızın belleğinde sizin için otomatik olarak yönetilmeyen ve CPU tarafından sıkı bir şekilde yönetilmeyen bir bölgedir. Daha serbest yüzen bir hafıza bölgesidir (ve daha büyüktür). Öbek üzerinde bellek ayırmak için, yerleşik C işlevleri olan malloc () veya calloc () kullanmanız gerekir. Öbek üzerinde bellek ayırdıktan sonra, artık ihtiyacınız olmadığında o belleği yeniden ayırmak için free () kullanmaktan sorumlusunuz.
Bunu yapamazsanız, programınız bellek sızıntısı olarak bilinen şeye sahip olacaktır. Yani, öbek üzerindeki bellek hala bir kenara bırakılacak (ve diğer işlemler için kullanılamayacak). Hata ayıklama bölümünde göreceğimiz gibi, bellek sızıntılarını tespit etmenize yardımcı olabilecek Valgrind adlı bir araç var .
Yığın aksine, yığın değişken boyutta boyut kısıtlamaları yoktur (bilgisayarınızın belirgin fiziksel sınırlamaları dışında). Yığın belleğinin okunması ve yazılması biraz daha yavaştır, çünkü öbekteki belleğe erişmek için işaretçiler kullanmak zorundadır. Kısaca işaretçiler hakkında konuşacağız.
Yığın aksine, yığın üzerinde oluşturulan değişkenlere programınızın herhangi bir yerinde herhangi bir işlevle erişilebilir. Yığın değişkenleri temelde küreseldir.
Daha fazlasını burada bulabilirsiniz .
Yığına ayrılan değişkenler doğrudan belleğe kaydedilir ve bu belleğe erişim çok hızlıdır ve program derlendiğinde tahsisi ele alınır. Bir işlev veya yöntem sırayla başka bir işlevi vb. Çağıran başka bir işlevi çağırdığında, tüm bu işlevlerin yürütülmesi en son işlev değerini döndürene kadar askıda kalır. Yığın her zaman bir LIFO düzeninde ayrılır, en son ayrılmış blok her zaman serbest bırakılacak bir sonraki bloktur. Bu, yığını takip etmeyi gerçekten kolaylaştırır, yığıntan bir blok serbest bırakmak bir işaretçiyi ayarlamaktan başka bir şey değildir.
Öbek üzerinde ayrılan değişkenlerin bellekleri çalışma zamanında ayrılır ve bu belleğe erişmek biraz daha yavaştır, ancak yığın boyutu yalnızca sanal belleğin boyutu ile sınırlıdır. Yığın öğelerinin birbirine bağımlılığı yoktur ve her zaman her zaman rastgele erişilebilir. Bir bloğu istediğiniz zaman tahsis edebilir ve istediğiniz zaman serbest bırakabilirsiniz. Bu, herhangi bir zamanda yığının hangi bölümlerinin tahsis edildiğini veya serbest olduğunu izlemeyi çok daha karmaşık hale getirir.
Derleme süresinden önce ne kadar veri ayırmanız gerektiğini tam olarak biliyorsanız ve çok büyük değilse yığını kullanabilirsiniz. Çalışma zamanında ne kadar veriye ihtiyacınız olacağını tam olarak bilmiyorsanız veya çok fazla veri ayırmanız gerekiyorsa öbeği kullanabilirsiniz.
Çok iş parçacıklı bir durumda, her iş parçacığının kendi bağımsız yığını vardır, ancak yığını paylaşırlar. Yığın iş parçacığına ve yığın uygulamaya özeldir. Yığın, özel durum işleme ve iş parçacığı yürütmelerinde dikkate alınması önemlidir.
Her iş parçacığı bir yığın alır, ancak uygulama için yalnızca bir yığın vardır (farklı ayırma türleri için birden çok yığın olması nadir olmamasına rağmen).
Çalışma zamanında, uygulamanın daha fazla yığın gerektirmesi durumunda, boş bellekten bellek ayırabilir ve yığının belleğe ihtiyacı varsa, uygulama için boş bellekten ayrılan bellekten bellek ayırabilir.
Hatta burada ve burada daha fazla ayrıntı verilmektedir .
Şimdi sorunuzun cevaplarına gelin .
İşletim sistemi veya dil çalışma zamanı tarafından ne ölçüde kontrol ediliyorlar?
İş parçacığı oluşturulduğunda işletim sistemi yığını, sistem düzeyindeki her iş parçacığı için ayırır. Genellikle işletim sistemi, yığının uygulamaya tahsis edilmesi için dil çalışma zamanı tarafından çağrılır.
Daha fazlasını burada bulabilirsiniz .
Kapsamı nedir?
Zaten zirvede.
"Derleme süresinden önce ne kadar veri ayırmanız gerektiğini tam olarak biliyorsanız ve çok büyük değilse yığını kullanabilirsiniz. Çalışma zamanında ne kadar veriye ihtiyacınız olacağını tam olarak bilmiyorsanız veya çok fazla veri ayırmanız gerekiyor. "
Daha fazlasını burada bulabilirsiniz .
Her birinin boyutunu ne belirler?
Bir iş parçacığı oluşturulduğunda yığının boyutu OS tarafından ayarlanır . Yığın boyutu uygulama başlangıcında ayarlanır, ancak alan gerektiğinde büyüyebilir (ayırıcı işletim sisteminden daha fazla bellek ister).
Birini daha hızlı yapan nedir?
Yığın tahsisi çok daha hızlıdır çünkü gerçekten yaptığı tek şey yığın işaretçisini hareket ettirmektir. Bellek havuzlarını kullanarak, yığın tahsisinden karşılaştırılabilir performans elde edebilirsiniz, ancak bu biraz ek bir karmaşıklık ve kendi baş ağrılarıyla birlikte gelir.
Ayrıca, yığın ve yığın yalnızca bir performans değerlendirmesi değildir; ayrıca nesnelerin beklenen ömrü hakkında da çok şey anlatır.
Detaylar bulunabilir burada .