Geri git   Van.GEN.TR Forum | Yerel Van Forumu > Bilgisayar > Programlama > Visual Basic, Delphi, C++ Ve Diğer Diller

Cevapla
 
Konu Araçları Stil
Alt 15/12/07, 12:47   #1
Bur2
Korgeneral
 
Bur2 - ait Kullanıcı Resmi (Avatar)
 
Üyelik tarihi: Oct 2007
Bulunduğu yer: evde :)
Yaş: 45
Mesajlar: 2.544
Tecrübe Puanı: 50 Bur2 has a reputation beyond repute Bur2 has a reputation beyond repute Bur2 has a reputation beyond repute Bur2 has a reputation beyond repute Bur2 has a reputation beyond repute Bur2 has a reputation beyond repute Bur2 has a reputation beyond repute Bur2 has a reputation beyond repute Bur2 has a reputation beyond repute Bur2 has a reputation beyond repute Bur2 has a reputation beyond repute
Standart C++ için Garbage Collector yazmak

Yaklaşık üç satırı geçen tüm programlar çeşitli nedenlerle derleme anında (compile time) belirlenemeyen miktarda hafızaya ihtiyaç duyarlar. Bu programın çalışma anında (runtime) dinamik hafızayı (dynamic memory) kullanmasını zorunlu kılar.

Dinamik hafızanın yönetimi için iki temel yaklaşımdan söz edebiliriz.

• Manuel: Hafızayı alırsınız, kullanirsınız ve ne zaman isterseniz bırakırsınız. C++ bu yaklaşımı tercih eder. Bırakma zamanına ve sırasına biz karar verdiğimiz için tam olarak ne zaman destructor’larin çağırılacağını, hangi sıra ile çağırılacaklarına karar verebiliriz. Eğer bırakmayi unutursanız memory leak’ler en iyi ihtimalle sadece performansinizi düşürür, en kötü ihtimalle...

• Garbage Collection: Hafızayı alırsınız ve kullanırsınız. Bilinmeyen bir zamanda GC hafızayı birakir, bırakacağı garantilenmemiştir, destructor’ların hangi sıra ile çağirilacagı belirsizdir. Bu işlemlerin hepsi ekstra yük getirir ancak manuel yaklaşımda ortaya çikan memory leak problemi meydana gelmez.



C++’in GC’u olmamasına ragmen kolaylıkla kendi GC’umuzu yazabiliriz veya Boost Library gibi bir kütüphanedeki kullanabiliriz. Her iki yöntemi de aynı anda C++’da kullanmak mümkündür.

Gargabe collection üzerinde yapılan akademik çalışmalarla onlarca algoritma ve varyasyonlari geliştirilmiştir. Fakat yazının konusu C++ ile uygulanması olduğundan en temel ve eski algoritmayi, reference counting’i kullanacağiz.

Reference counting’de tüm hafıza parçaların adresleri ve kaç kez kullanıldıkları bir listede tutulur. Eğer bir parçanın kullanım sayısı sıfıra düşerse parça bırakılır. (liste the list structure değil, nitekim uygulamada stl::map’de saklayacağız ve muhtemelen red-black tree)

Örneğin aşağidakine reference counting yaptığimızı varsayalım.

int *p,*q,*h;

p = new int; //new’in döndügü adresin counter’i 1’dir, Sadece p onu kullaniyor

q = p; //su an 2 oldu, q ve p kullaniyor

h = new int; //bu hafiza parçasinin adresinin 0xdeadbeef oldugunu varsayalim.

h = q; //0xdeadbeef’in counter’i 0 oldu ve birakildi.

Bir class tanımlayıp onu pointer gibi kullanarak bu sayma işlemini yapabiliriz. “=” operatörünü overload’lamamız yeterli olacaktır. Ancak tam bir pointer’a yakın davranması için “*”, “->”,”[]” ve hatta kullanım kolaylığı için “(degişken tipi)” operatörlerini de overload edebiliriz. Uygulamamızda class “+”,”-“,”++”,”--“ gibi operatörleri desteklemeyecek çünkü C++’da hafıza parçaları başlangıç adresleri ile bırakılırlar.

int *p;

p = new int[64];

p++;

delete[] p; // ???


Kodu buradan indirebilirsiniz.:

Kodu [Bu Adresi (link) Görme Yetkiniz Yok BEDAVA'ya Üye Ol Sitemizden Faydalan....] indirebilirsiniz.:







Nasıl Kullanılır?

gcp<veri tipi> pointer_adi;

gcp<int> p; //int *p;

p = new int;

*p = 1234;

gcp<myclass> m = new myclass(“hello”);

m->do();

eğer array olarak kullanacaksanız

gcp<char,true> m = new char[64];

strcpy(m, "test string");

printf("%s\n",m);

gcp<int, true> p;

p = new int[64];

p[0] = 1234; //pointer aritmetigi için

int *r = p; // tanimini yapip r üzerinden kullanabilirsiniz.

References

Donald E. Knuth. The Art of Computer Programming Vol.1

Bjarne Stroustrup. The C++ Reference Manual.

Herbert Schildt. The Art of C++.

Daniel R. Edelson. A Mark-and-Sweep Collector for C++.







Nasıl çalışır?
Çoğu 16-bit’lik sistemlerin aksine 32 ve 64-bit sistemde C pointer’ları sadece offset’i gösterirler. Her offset register büyüklüğündedir. O halde pointer’larla unsigned long olarak işlem yapabiliriz. gcp’de m_CounterMap şöyle tanımlıdır. static std::map<unsigned long, gc_meminfo<T> > m_CounterMap;
pointer’ları unsigned bu map’in key’i olarak kullanabiliriz, gc_meminfo ise sadece 3 tane public member variable’a sahiptir. int m_nCount;
bool m_fArray;
T* m_pObject;
m_nCount: bu hafıza parçasının kullanım sayısı. m_fArray: array mi ? m_pObject: pointer
0xdeadbeef’in kaç farklı yerde kullanıldığını bulmak isterseniz map::find’i kullanmanız yeterli olur.
iter = m_CounterMap.find((unsigned long)0xdeadbeef);
{
gcp<char,true> m; //NULL pointer'in counter'i 1 atar
m = new char[64]; //NULL pointer'in counter'i 1 azalar ve "new"'in döndürdüğü değer için counter 1 artar
strcpy(m, "test string"); //operator T*(), m_pCurrent ile en son sahip olunan pointer'i döndürür
printf("%s\n",m);
} //Out of scope, m'in destructor'u çağırılır. Destructor m_pCurrent'in counter'ini 1 azaltır ve collect()'i çağırır. Collect() fonksiyonu counter'ları 0'a düşen bütün hafızaları bırakır.
__________________

[Bu Adresi (link) Görme Yetkiniz Yok BEDAVA'ya Üye Ol Sitemizden Faydalan....]

[Bu Adresi (link) Görme Yetkiniz Yok BEDAVA'ya Üye Ol Sitemizden Faydalan....]


Bur2 isimli Üye şimdilik offline konumundadır   Alıntı ile Cevapla
Konu Sayısı: 497
Takımınız:
Alt 31/07/08, 15:30   #2
Neutralizer
Yasaklı kullanıcı
 
Neutralizer - ait Kullanıcı Resmi (Avatar)
 
Üyelik tarihi: Jan 2008
Bulunduğu yer: İstediğin yerden
Mesajlar: 1.883
Tecrübe Puanı: 0 Neutralizer has a reputation beyond repute Neutralizer has a reputation beyond repute Neutralizer has a reputation beyond repute Neutralizer has a reputation beyond repute Neutralizer has a reputation beyond repute Neutralizer has a reputation beyond repute Neutralizer has a reputation beyond repute Neutralizer has a reputation beyond repute Neutralizer has a reputation beyond repute Neutralizer has a reputation beyond repute Neutralizer has a reputation beyond repute
Standart

paylaşım için tkrlr
Neutralizer isimli Üye şimdilik offline konumundadır   Alıntı ile Cevapla
Konu Sayısı: 316
Takımınız:
Cevapla


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 

Yetkileriniz
Yeni Mesaj yazma yetkiniz Aktif değil dir.
Mesajlara Cevap verme yetkiniz aktif değil dir.
Eklenti ekleme yetkiniz Aktif değil dir.
Kendi Mesajınızı değiştirme yetkiniz Aktif değildir dir.

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-KodlarıKapalı
Gitmek istediğiniz klasörü seçiniz


Bütün Zaman Ayarları WEZ +3 olarak düzenlenmiştir. Şu Anki Saat: 23:30 .


Powered by vBulletin
Copyright © 2000-2007 Jelsoft Enterprises Limited.
Sitemap
6, 5, 3, 7, 8, 9, 10, 11, 12, 13, 14, 15, 113, 16, 17, 18, 19, 81, 20, 27, 22, 23, 24, 25, 26, 48, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 43, 136, 40, 58, 45, 42, 44, 46, 47, 53, 54, 55, 56, 57, 59, 60, 70, 61, 62, 63, 64, 65, 66, 68, 69, 71, 72, 74, 75, 76, 77, 78, 79, 80, 82, 83, 96, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 98, 97, 100, 101, 102, 103, 106, 104, 105, 112, 109, 108, 107, 110, 111, 114, 115, 118, 116, 117, 119, 148, 154, 124, 165, 122, 120, 123, 121, 150, 153, 125, 128, 129, 131, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 151, 149, 202, 175, 164, 152, 167, 155, 156, 157, 158, 159, 160, 161, 162, 163, 195, 169, 166, 168, 170, 171, 172, 199, 174, 173, 196, 200, 176, 177, 180, 178, 179, 182, 189, 187, 184, 186, 191, 192, 193, 194, 197, 198, 201, 203, 229, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 236, 231, 232, 233, 234, 235, 237, 240, 239, 241, 243, 242, 244,