Ali hocam D dilinde struct destructor ı neye göre işletiliyor?
Zekeriya
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
August 29, 2013 Struct destructors | ||||
---|---|---|---|---|
| ||||
Ali hocam D dilinde struct destructor ı neye göre işletiliyor? Zekeriya -- |
August 29, 2013 Struct destructors | ||||
---|---|---|---|---|
| ||||
Posted in reply to Talha Zekeriya Durmuş (zekeriyadurmus) |
Böyle bir kod çalıştırdığım zaman cast edildiği an ~this çağırılıyor ama ben bunu çöp toplayıcılar çalıştığı zaman veya ne bileyim ben gerçekten de bu nesne ile ilişkimi kestiğim zaman çağırması için nasıl ayarlayabilirim? Zekeriya -- |
August 29, 2013 Struct destructors | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Anlıyorum hocam bu olayları öğrenmem iyi oldu peki new ile malloc arasındaki fark nedir tam olarak? new stack kullanıyor malloc heap değil mi?
O zaman ~this işlevine güvenmemeliyiz(kendi sistemim için konuşuyorum). Her struct için ben böyle bir fonksiyon oluşturup onu çağırmalıyım. Şimdi önbellekleme olayları üzerinde çalışıyorum 1-2 bir şey yaptım ama memory leak oluştu :) Zekeriya -- |
August 29, 2013 Struct destructors | ||||
---|---|---|---|---|
| ||||
Posted in reply to Talha Zekeriya Durmuş (zekeriyadurmus) | Alıntı (zekeriyadurmus): >Anlıyorum hocam bu olayları öğrenmem iyi oldu peki new ile malloc arasındaki fark nedir tam olarak? new stack kullanıyor malloc heap değil mi? Ali Hocam daha iyi bilir ama kendi bildigim kadariyla soyleyeyim new'un malloc'tan farki, bellek ayirmak yaninda bir de orada bir nesne kurmasidir. new'un malloc'tan farkı şudur. bellek ayırırsın bildiğin gibi bir de o alanda nesne oluşturursun ya da kurarsın. yani new 2 is yaparken, malloc tek is yapar. nesne icin bir yer ayirma(nesnenin boyutu kadar) ve nesneyi orada olusturma isini new istenen buyuklukteki yer ayirma isini de malloc hallediyordu. en azindan C'de boyleydi de D'de ayni mi acaba. ben new'un heap'de olustugunu biliyordum. (dogrulugunu bilmiyorum, sadece tahminim) heap'de yer olusturman, runtime esnasinda performans kaybina yol acabilir. new ile olusturduklarin otomatik sonlanma islemi yapamiyordu. burada sonlandirma islemini sanirim destroy(); yapıyordu. http://ddili.org/ders/d/clear.html burada destroy'u açıklamış Ali hoca. Ben yine de kafani karistirmayayim, Ali hocam daha dogru bilgiyi sunacaktir :) -- |
August 29, 2013 Struct destructors | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Hocam telefondan yaziyorum :) Once C'de diye cumle kurmustum, cumleyi duzeltmeyi unutmusum :( -- |
August 29, 2013 Struct destructors | ||||
---|---|---|---|---|
| ||||
Posted in reply to Talha Zekeriya Durmuş (zekeriyadurmus) | En temel yanıtını biliyoruz: Sonlandırıcı, yapı nesnesinin yaşadığı kapsamdan çıkıldığında işletilir. Ama burada yapı nesnesi dinamik olarak kurulduğu için yaşadığı kapsamdan çıkma gibi bir durum yok. Beni de şaşırtan bilgi: Çöp toplayıcı yapı nesnelerini sonlandırmaz! Bu olayları daha da karmaşıklaştıran işlemler de var: Kopyalama ve atama. Hatta, kopyalanan veya atanan nesnenin sol değer veya sağ değer olmasına bağlı olarak, sonlandırıcı işletilmeyebiliyor. Benim DConf 2013 sunumum bu konular üzerineydi. Buna rağmen uzmanı olduğumu söyleyemiyorum. ;) Alıntı (zekeriyadurmus): >cast edildiği an ~this çağırılıyor Orada yanıltıcı bir durum var: ~this'in çağrıldığı nesne senin nesnen değil, writeln'a kopyalanan nesne. Sonlandırıcı içinde nesnenin adresini de yazdır:
dmd v2.064-devel-52cc287 ile derlenen çıktısı inanılmaz! ;) '7FFF9148B028 sonlanıyor 7FFF9148AFB0 sonlanıyor Dikkat edersen senin kurduğun 7F9433AA3FA0 hiç sonlanmıyor. writeln değer olarak aldığı ve sonra kendi içinde bir çok kere başka işlevlere de kopyaladığı için öyle şeyler görüyorsun. Bu çıktının eniyileştirmeler sonucunda gdc ve ldc ile ve ileride dmd ile daha kısa olacağını bekleyebiliriz. Ali -- |
August 29, 2013 Struct destructors | ||||
---|---|---|---|---|
| ||||
Posted in reply to agora | agora'nın söylediklerine tek düzeltme yapılabilir. :) Alıntı: >C'de boyleydi Tabii C++'ta öyleydi çünkü C'de new yok. Ali -- |