Thread overview
D dilinde sonsuz elaman alan diziler
Jan 06, 2013
Salih Dinçer
Jan 06, 2013
Salih Dinçer
January 06, 2013

D dilindeki dizi mantığı c ve cpp de yok.

Örneğin
D dilinde int[] sayi; derken
C dilnde araya malloc'lar giriyor veya resize işlemleri yapılıyor.

D dili de malloclarla mı çalışıyor? Veya 1000 eleman 1000 eleman ihtiyaç duydukça kendisini mi genişletiyor?

Veya başka bir yolla mı yapıyor?

Zekeriya

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

January 06, 2013

Elbette bütün bu işlemleri çöp toplayıcı yapıyor yani her şey otomatik.

Sanırım forumda paylaşmıştım ama yerini henüz hatırlamıyorum. Bulunca şunlardan emin olacağım:
''(BULDUM: http://ddili.org/forum/post/8327)''
Bir dinamik dizi açtığımızda 8 ya da 16 elemanlı bir bellek bölgesi ayrılıyor. Eğer reserve edilen alan geçilirse bütün veri başka bir bellek bölgesine taşınıyor ama bu sefer reserve edilen alan ikiye mi ne katlanıyordu. Yani her seferinde fazlasıyla artan ve daha az olasılıkla taşınan veriden bahsediyoruz.

Neden daha az olasılık?

Çünkü reserve edilen (ilklenen, kullanıma hazır tutulan) alan her seferinde öncekine nazaran çok fazla olacak şekilde katlanıyor. Bu iyi bir şey çünkü veri büyüdüğü için taşınma süresi ilerleyen zamanlarda aşırı gecikmeye neden olabilir. Yani, zamanla varsayılan genişleme değeri büyürken taşınma için harcanan süre etkin kullanılıyor/ eniyileştiriliyor / optimization edilmiş oluyor...

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

January 06, 2013

Evet, D dizilerinin bellek yönetimi otomatik ve çöp toplayıcıya bağlı. Çöp toplayıcı da çalışma ortamının (D runtime) bir parçası.

Dizi büyüdükçe tam olarak realloc'u mu çağırdıklarını bilmiyorum ama dmd'nin çalışma ortamı da açık kodludur:

https://github.com/D-Programming-Language

Dizilerle ilgili ayrıntılar şu yazıda (ve aslında oradaki İngilizce bağlantısında) var:

http://ddili.org/makale/d_dilimleri.html

Ali

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

January 06, 2013

Alıntı (Salih Dinçer):

>

bütün veri başka bir bellek bölgesine taşınıyor ama bu sefer reserve edilen alan ikiye mi ne katlanıyordu

O çok uygulanan bir büyüme yöntemiydi. Daha sonradan %50 büyümenin daha akıllıca olduğu gösterildi. Çoğu C++ kütüphanesinde örneğin vector'lerin artık %50 büyüdüklerini biliyorum.

O yazıda da anlatıldığı gibi, D daha karmaşık bir algoritma uyguluyor ve komşu bellek alanı boşsa orayı da diziye ayırıyor. Aşağıdaki programın çıktısı kapasite artışının her zaman %100 kadar olmadığını gösteriyor:

import std.stdio;
import std.array;

void main()
{
   int[] dizi;
   size_t sonYazılanKapasite = size_t.max;

   writeln("    Uzunluk   Kapasite   Artış");

   while (dizi.capacity < 100_000) {
       dizi ~= 0;
       if (dizi.capacity != sonYazılanKapasite) {
           // Kapasite artmış
           sonYazılanKapasite = dizi.capacity;
           double artış = (cast(double)dizi.capacity / dizi.length * 100) - 100;
           writefln("%10s%10s      %%%s",
                    dizi.length, sonYazılanKapasite, cast(size_t)artış);
       }
   }
}

Bendeki bir çıktısı:

' Uzunluk Kapasite Artış
1 3 %200
4 7 %75
8 15 %87
16 31 %93
32 63 %96
64 127 %98
128 255 %99
256 511 %99
512 1019 %99
1020 2043 %100
2044 4091 %100
4092 7163 %75
7164 12283 %71
12284 16379 %33
16380 17403 %6
17404 27643 %58
27644 32763 %18
32764 33787 %3
33788 53243 %57
53244 65531 %23
65532 66555 %1
66556 101371 %52
'

Ali

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

January 06, 2013

Elinize sağlık hocam...

Kuşkusuz biz programcılara yakışan en iyi cevap bu olmalı. Peki bir de ilk ve son elemanın adreslerine bakarak başka bilgiler edinebilir miyiz? Aşağıdaki sonuçlara göre bu mümkün görünüyor. Sanki 1K'dan (256*int32) sonra, veriyi, taşıma olasılığını düşürmek için genişletebileceği daha boş bir alana kopyalıyor öyle değil mi?

:    :    :
   writeln("ilk/Son Adresi     Uzunluk   Kapasite   Artis");

   while (dizi.capacity < 1024<<10) {
       dizi ~= 0;
       if (dizi.capacity != sonYazılanKapasite) {
           // Kapasite artmış
           sonYazılanKapasite = dizi.capacity;
           double artış = (cast(double)dizi.capacity / dizi.length * 100) - 100;
           writefln("%s/%s%10s%10s      %%%s", &dizi[0], &dizi[$-1],
                     dizi.length, sonYazılanKapasite, cast(size_t)artış);
       }
   }

'İlk/Son Adresi Uzunluk Kapasite Artış
1151FC0/1151FC0 1 3 %200
1152FA0/1152FAC 4 7 %75
1153F40/1153F5C 8 15 %87
1150F00/1150F3C 16 31 %93
1154F00/1154F7C 32 63 %96
1155E00/1155EFC 64 127 %98
1156C00/1156DFC 128 255 %99
1157800/1157BFC 256 511 %99
1D30010/1D3080C 512 1019 %99
1D30010/1D30FFC 1020 2043 %100
1D30010/1D31FFC 2044 4091 %100
1D30010/1D33FFC 4092 7163 %75
1D30010/1D36FFC 7164 12283 %71
1D30010/1D3BFFC 12284 16379 %33
1D30010/1D3FFFC 16380 17403 %6
1D30010/1D40FFC 17404 27643 %58
1D30010/1D4AFFC 27644 32763 %18
1D30010/1D4FFFC 32764 33787 %3
1D30010/1D50FFC 33788 53243 %57
1D30010/1D63FFC 53244 65531 %23
1D30010/1D6FFFC 65532 66555 %1
1D30010/1D70FFC 66556 101371 %52
1D30010/1D92FFC 101372 114683 %13
1D30010/1D9FFFC 114684 115707 %0
1D30010/1DA0FFC 115708 176123 %52
1D30010/1DDBFFC 176124 180219 %2
1E30010/1EDFFFC 180220 270331 %50
1E30010/1F37FFC 270332 278523 %3
2030010/213FFFC 278524 409595 %47
2030010/21BFFFC 409596 410619 %0
2030010/21C0FFC 410620 604155 %47
2030010/227DFFC 604156 606203 %0
2290010/24DFFFC 606204 879611 %45
2290010/25EAFFC 879612 884731 %0
2290010/25EFFFC 884732 885755 %0
2290010/25F0FFC 885756 1285115 %45'

Ayrıca döngü uzunluğunu arttırınca sık sık %0'lar ile ve gittikçe seyrekleşen (ve düşen!) %45-%35... arası değerler ile karşılaşıyoruz. Burada çok akıllıca bir algoritma olduğunu seziyorum!

Başarılar...

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

January 07, 2013

Hocam gerçekten çok teşekkür ederim. Konuyu anlamam açısından iyi oldu ASM'ye biraz merak sardım ve bu tarz işlemlerin nasıl yapıldığını merak ettim.

Verdiğiniz kaynakları okudum ve örnekleri inceledim. Ama gerçekten D de dizi mantığı çok güzel hazırlanmış.

Ellerinize sağlık.

Zekeriya

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

January 07, 2013

Alıntı (Salih Dinçer):

>

Peki bir de ilk ve son elemanın adreslerine bakarak başka bilgiler edinebilir miyiz? Aşağıdaki sonuçlara göre bu mümkün görünüyor.

Haklısın. :)

Ali

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