Thread overview
Stack & Heap hafıza ve Değişken yerleşimleri
Jun 13, 2020
cos00kun
Jun 13, 2020
cos00kun
June 13, 2020

Bugün D dili için farklı bir konuyu merak ettim. Değişkenlerin,Dizilerin, Dinamik dizilerin v.s. Hafızadaki yerleşim durumları..
Değişkenler, değişmezler, sınıflar, yapılar, referanslar, Diziler'in v.s. hangileri Hafızanın Stack bölümünü, hangileri Heap bölümünü kullanıyorlar ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 13, 2020

Teşekkürler.. Tam da tahmin ettiğim gibi.. Dediğiniz mantıklı.. zaman buldukça aklıma gelen her nesne,değişken vs.. hafıza adreslerine bakıp not alacağım.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 13, 2020

Yerleşim (ve dolayısıyla yaşam süreci) açısından ikiden fazla çeşit var ama aralarında kesin çizgi çekmek mümkün olmayabilir.

  • Stack: Yerel değişkenler, işlev parametre değerleri, işlev dönüş değerleri, işlemler sırasında oluşturulan geçici değerler, statik dizi elemanları, vs. Ama, eğer o değer örneğin bir yapı türüyse ve o yapının bir üyesi new ile heap'ten ediniliyorsa o üye stack'te değildir.

  • Heap: new ile oluşturulan her şey (örneğin sınıf nesneleri), dinamik dizi elemanları için ayrılan alan, eşleme tablosu elemanları için ayrılan alan, bir temsilcinin (delegate) sonradan erişeceği değişkenlerin barındırıldığı bölge vs. Ama, sınıf nesneleri bile scoped ile stack'e yerleştirilebilir. (scope'tan bahsetmiyorum ama galiba onun da etkisi aynıymış; emin değilim.)

  • İş parçacığı özel alanı (thread local storage): Yukarıdaki çeşitten olmayan değişkenler buradadır. Örneğin, modül düzeyinde tanımlanmış değişkenler, iç kapsamlarda 'static' olarak tanımlanmış değişkenler, yapıların ve sınıfların static değişkenleri, vs.

  • Evrensel bölge: Yine modül düzeyinde ama 'shared' olarak tanımlanan değişkenler bütün iş parçacıkları tarafından erişilebilen bölgededir. (Belki de bütün shared değişkenler böyledir; emin değilim.)

  • C gibi evrensel bölge: __gshared olarak tanımlanan değişkeler bir önceki değişkenlerden farklı ve hatta galiba çok az da olsa daha hızlı olan ve C ve C++'ta olduğu gibi tam anlamda global olan değişkenlermiş.

Kaçırdıklarım olabilir ve bazılarını bilmiyorum bile ama şimdilik bu kadar yeter herhalde. :)

Bu gibi konuları araştırmak için kaba bir yöntem, farklı değişkenlerin adreslerini karşılaştırmaktır. Eğer iki değişkenin adresleri birbirlerine yakınsa aynı çeşitten oldukları düşünülebilir. Örneğin, işlev çağrı yığıtında bulunan iki değişkenin adresleri bellekte yan yana durduklarını gösterebilir.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]