Nedenini düşünmemiştim ama herhalde kurucu işleve girildiğinde anlamlı değerleri olsun diye bir ilkleme alanı düşünülmüş olmalı. D'de olduğu gibi ilk değer verilmesi yeterli olmazdı çünkü üyelerin değerlerini her nesne için aynı olması sık rastlanılan bir durum değil.
D'de durum farklı: C ve C++'ın aksine, her değişken otomatik olarak ilklenir (D'nin doğru kararlarından birisi). (İstenmiyorsa '= void' ile ilklenmemiş halde bırakılabilir.) O yüzden, ilk değerlerin tür içinde verilmesi sorunlu değil. Yapılarda ilk değer, yani 'BenimYapım.init' değeri, gereken adet bayttan oluşur. Bu ilk değer, nesne oluşturulduğunda nesnenin bulunduğu yere toptan kopyalanır.
Ancak, gösterdiğin "bir atama degil D de hayata getirme" örneği sınıflar için doğru değil. Hatta, yapılar için bile doğru değil çünkü açıkça değer atıyorsun. Sanırım üye tanımındaki atamayı düşünerek yazmış olmalısın:
O kodun assembly'sine batığımızda (D ile gelen obj2asm programı kullanılabilir) yapının ilk değerinin bir yazmaca (RDX) yerleştirildiğini ve writeln'ın o değerle çağrıldığını görüyoruz (ldc2 ile ve -O5 seçeneği ile derledim):
struct S {
int a = 0x55555555;
int b = 0xaaaaaaaa;
}
//...
auto s = S();
writeln(s);
'
mov RDX,0AAAAAAAA55555555h
mov ESI,0Ah
mov RDI,RBX
call _D3std5stdio4File23__T5writeTS6deneme1STaZ5writeMFNfS6deneme1SaZv@PLT32
'
Yani, dediğin gibi, yapı oluşturulurken üyelere teker teker atama yapılmıyor.
Sınıflarda öyle değil:
class C {
int a = 0x55555555;
int b = 0xaaaaaaaa;
void foo() {
writeln(a, b);
}
}
/...
auto c = new C();
c.foo();
Görüldüğü gibi, ayrı ayrı atanıyor:
' mov EDX,0AAAAAAAAh
mov ECX,055555555h
mov RDI,RBX
call _D3std5stdio4File16__T5writeTiTiTaZ5writeMFNfiiaZv@PLT32
'
İşin güzeli, o ilk değerler fazladan masraf getirmiyor. Örneğin, bir kurucu işlev eklesek ve üyelerden birisine kendimiz farklı bir değer atasak, o üyeye iki kere atanmıyor.
this() {
b = 0x11111111;
}
Artık 0xaaaaaaaa ataması yok:
'
mov EDX,011111111h
mov ECX,055555555h
mov RDI,RBX
call _D3std5stdio4File16__T5writeTiTiTaZ5writeMFNfiiaZv@PLT32
'
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]