Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

metaprogramlama ile alakali ufak bir soru


Fly

Öne çıkan mesajlar

metaprogramming revize ederken aklima geldi, sirayla aklimdakileri de yaziyorum yanlisim varsa uyarin :

fibonacciyi ele alirsak return fib()+return fib() dersek fonksiyonlar neticede fonksiyon cagrisi yapiyor eninde sonunda, performans bakimindan pek de bir esprisi olmuyor template kullanmanin

o yuzden compiler hesaplasin diye template islemine tabi tutulan structlar icine sarilmis bir sekilde sabit degerler veriyoruz

tam anlayamadigim sey gordugum orneklerde enum'un "yer kaplamiyor" diye gecmesi

static const tatava dedigimizde tamam, N tane tatava tipi sey olusuyor her sayi icin
diger avantaji da memory access ile erisebildigimiz bisey olmuyor enum dedigimizde sonucta, ona da ok

ama "yer kaplamiyor" nasil bir sey onu anlamadim. en azindan fib<1234>::val su degere esittir diye binarynin icinde yer edinmiyor mu kendisine ?

variable'a erismekten daha hizli olabilir de bunu anlamadim, buldugum cogu ornek de ayni telden cevap vermis ya da kafam basmadi su anda, net aciklamasi olan ?
Link to comment
Sosyal ağlarda paylaş

tam degil, hayir

Factorial<4> struct taniminin icinde 24 ile baslayan ve struct scope'una ait bir enum tanimlaniyor

instance almiyoruz evet, class tanimlayip kullanmadigimizda standart int mint olsa yer kaplamamali (sanirim) ama 24'ten basla dedigimiz bir enum tanimi oluyor sonucta

o 24'u bir yere sokuyor olmaliyiz
bilmek istedigim "bu specializationda constant bir class member var, degeri 24" ile arasindaki fark

direk define degilse de literal olarak oraya giriyor yani neticede

varmaya calistigim nokta kullanici sayi girdiginde compiletime'da olusturdugu tablo/vektor/etcye erismek

hesaplanmis enum degerlerini rekursif olarak atarak runtime'da doldurani var da onu istemiyorum
Link to comment
Sosyal ağlarda paylaş

Evet farkli kaynaklardan baktim benim anladigim gibi degilmis fakat soyle kullanim alanlari olabilir:

Diyelim karmasik bir fonksiyonun var fakat icindeki bir parametreden emin degilsin. 3le mi carpman gerektigi 2yle mi carpman gerektigi gibi. Ve kodunda da bu fonksiyonu 100 kere cagiriyorsun.

Eger template metaprogramming ile yaparsan tek bir karakter degistirip programin performansini gorebilirsin diger turlu o enum'u bastan yazmak zorundasin, veya 100+ entry oldugunu dusunursek elle yazmak zor olacagindan bu enumu output olarak veren 2. bir c programi yazmak zorunda kalabilirsin.

edit: sanirim farki sadece yer kaplama acisindan sormussun ben baska biseye cevap vermisim, neyse uplanmis oldu haha
Link to comment
Sosyal ağlarda paylaş

compiletime'da hesaplanani runtime'da dinamik olarak erisilebilecek bir yere atmasi dert

sebebi de spesiyalize seyi kullanici inputuna falan gore cagiramiyorsun dogal olarak, compiler ne uretecegini onceden bilmek istiyor

tabloyu runtime'da olusturmak cok zor degil, pseudocode tadinda soyle az bucuk, derlemedim de dogrudur muhtemelen :


template<long long K> void fact::populateVector(std::vector<long long int> &vals)
{
vals.push_front(fact<K>::value)
fact::populateVector(vals);
}
template<> void fact<0>::populateVector(std::vector<long long int> &vals)
{
vals.push_front(0);
}
template<> void fact<1>::populateVector(std::vector<long long int> &vals)
{
vals.push_front(1);
fact<0>::populateVector(vals);
}


main'de dolduracagin limite gore popule ediyorsun falan fesmekan
value'lar onceden hesaplanmis oldugu icin o degeri pushlayip diger metodu cagirmak disinda masrafi yok

ama ben o masraftan da kacinilabilir mi onu merak ediyorum

cunku cogu ornek user inputu sallamadan programcinin bildigi durumlara has, memoization gibi seyleri compile sirasinda kendi halletsin ne kullanici beklesin ne de ben elle tek tek gireyim

istedigim sey bu
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...