Thread overview
August 29, 2013

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. ]

August 29, 2013
module main;

import std.stdio;

struct str{
	int y;
	int z;
	~this(){
		writeln("çalıtşı!");
	}
}


int main(string[] argv){
	auto a = cast(void*) new str(4,4);
	while(1){}
	writeln(*cast(str*)a);
	return 0;
}

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

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

August 29, 2013

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?

module main;

import std.stdio;
import core.memory;


struct str{
	int y;
	int z;
	final destroy(){
		GC.free(&this);
	}
}

T* smalloc(T, D...)(D datas){
	auto v = cast(T*) GC.malloc(str.sizeof);
	*v = T(datas);
	return v;
}

import std.datetime;

int main(string[] argv){

	GC.disable();

	auto p1 = Clock.currTime();
	for (int i; i < 1_000_000; i++){
		auto obj = smalloc!str;
		writeln("val: ", obj);
		obj.destroy();
	}

	while(1){}
	//writeln(*cast(str*)a);
	return 0;
}

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

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

August 29, 2013

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 :)

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

August 29, 2013

Hocam telefondan yaziyorum :)

Once C'de diye cumle kurmustum, cumleyi duzeltmeyi unutmusum :(

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

August 29, 2013

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:

import std.stdio;

struct str{
   int y;
   int z;
   ~this(){
       writefln("%s sonlanıyor", &this);
   }
}

int main(string[] argv){
   auto a = cast(void*) new str(4,4);
   writefln("%s kuruldu", a);
   writeln(*cast(str*)a);
   return 0;
}

dmd v2.064-devel-52cc287 ile derlenen çıktısı inanılmaz! ;)

'7FFF9148B028 sonlanıyor
7F9433AA3FA0 kuruldu
str(4, 4)7FFF9148AEE0 sonlanıyor
7FFF9148AF88 sonlanıyor

7FFF9148AFB0 sonlanıyor
7FFF9148B000 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

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

August 29, 2013

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

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