Thread overview
Bir fonksiyona tekli değer veya dizi parametresi geçebilmek için şablon kullanımı
Mar 30, 2018
kerdemdemir
May 15, 2018
huseyin
March 30, 2018

Merhaba,

Aşağıdaki kodda foo fonksiyonu ile bazen [4,2,2,1] gibi bir dizi veya sadece 5 gibi tekli değerler ekleyebilmek istiyorum.

Sanıyorsam int[] inTemp... gibi bir parametrede kullanabilirdim.

Sorum bu işi yapmak için şablonlar doğru bir seçim midir. Yoksa bu iş genelde başka şekildemi yapılır?

import std.stdio;
int [] temp;

void foo(T)( T inTemp )
{
temp ~= inTemp;
}

void main()
{
foo(5);
foo([4,2,2,1]);

writeln(temp);//[5, 4, 2, 2, 1]
}

Erdemdem

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

March 30, 2018

Başka bir yöntem de işlev yükleme. (Bunda da eleman türü şablon parametresi olabilir.) Aynı isimdeki işlevlerden birisi tek değer alır, diğerini 'foo([değer]);' diye çağırır:

import std.stdio;

void foo(int[] dizi) {
   writefln("%(%s, %)", dizi);
}

void foo(int i) {
   foo([i]);
}

void main() {
   foo(42);
}

Tabii diğerini çağırmak yerine tek elemanı doğrudan da kullanabilir (senin örneğinde şanslıyız çünkü ~= işleci her iki türü de destekliyor) çünkü o geçici dizinin oluşturulmasının da masrafı olacaktır. Denemeden bilinmez. Bu gibi şeyleri denemenin en kolay yolu assembly'sine bakmaktır.

Şurada bakmak kolay (ASM'ye tıklayın):

https://run.dlang.io/is/nHMGh0

'_d_arrayliteralTX@PLT32' çağrısının ne kadar masraflı olduğunu bilmiyorum ama tabii biraz masraf ekliyor:
'
void onlineapp.foo(int):
push RBP
mov RBP,RSP
sub RSP,010h
mov -8[RBP],RDI
mov ESI,1
mov RDI,TypeInfo_Ai.__init@GOTPCREL[RIP]
call _d_arrayliteralTX@PLT32
mov RDI,-8[RBP]
mov [RAX],EDI
mov RDX,RAX
mov EDI,1
mov RSI,RDX
call void onlineapp.foo(int[])@PLT32
mov RSP,RBP
pop RBP
ret
'
Not: Böyle masrafların hemen hemen hiçbir zaman önemi yoktur. Bilgilenmek için bakıyorum.

Ali

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

May 15, 2018

En çok kafama takılan konu açılmış hemen altına bir soru daha soracağım Ali hocama.

Öncelikle, bu tarz olaylar bildiğim kadarıyla javascriptle birlikte popüler oldu ki ben de uzun bir süredir javascriptle uğraşıyorum. NodeJS kullanıyorum ve altyapısında V8 var. Javascript yapısı gereği prototip üretme üzerine çalışıyor yani bu örnekten ilerlersek: f(x) gibi bir fonksiyonunuz varsa x in hem array hem int olma durumunu tek bir fonksiyon ifade edebiliyor V8 arka planda 2 tane fonksiyon çıktısı üretiyor ki bunu biz D de açık bir şekilde tanımlıyoruz. Neyse konuya girmek gerekirse.

Javascriptte bunu yapmak bildiğim kadarıyla performans düşümüne(deopt) yol açıyor fakat D derlemeli bir olduğu için aynı isimde fonksiyon tanımlama yani işlev yükleme farklı isimde 2 fonksiyon tanımlanma ile kıyaslandığında fark ne olur?

Kısaca söylemek gerekirse:

void f(int[] x)
void f(int x)

ile

void f(int x)
void fArray(int[] x)

Bu iki durumun bize performans olarak farkı oluşur mu? Sanırım compile-time da zaman tasarrufu sağlayabilir.

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

May 15, 2018

İki durumun performans olarak hiçbir farkı yok. (Assembly'sine bakmadan yazıyorum; yanılıyor olabilirim. :) ) İkisinde de iki farklı işlev üretilir ve hangisinin çağrılacağı derleme zamanında belirlenir. Tek fark, bir durumda işlevin ismi tamamen derleyici tarafından belirleniyor (name mangling), diğerinde olaya programcı da karışıyor (isimleri f ve fArray olarak başlatıyor ama name mangling o durumda da geçerli).

Ali

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