C++

2010-03-04 8 views
5

inlining karşı şablonlarla metaprogramming o dizi elemanları kopyalamak için aşağıdaki gibi kod yazmak değer mi:C++

#include <iostream> 
using namespace std; 


template<int START, int N> 
struct Repeat { 
    static void copy (int * x, int * y) { 
    x[START+N-1] = y[START+N-1]; 
    Repeat<START, N-1>::copy(x,y); 
    } 
}; 

template<int START> 
struct Repeat<START, 0> { 
    static void copy (int * x, int * y) { 
    x[START] = y[START]; 
    } 
}; 



int main() { 


    int a[10]; 
    int b[10]; 

      // initialize 
    for (int i=0; i<=9; i++) { 
    b[i] = 113 + i; 
    a[i] = 0; 
    } 

      // do the copy (starting at 2, 4 elements) 
    Repeat<2,4>::copy(a,b); 

      // show 
    for (int i=0; i<=9; i++) { 
    cout << a[i] << endl; 
    } 

} //() 

ya da bir satır içine işlevini kullanmak daha iyidir?

Birinci dezavantaj

şablonda değişkenleri kullanamazsınız olmasıdır.

+2

Sadece std :: copy' kullanmalısınız. * Bu *, int dizileri arasında kopyalamayı memmove'a iletmek için bazı meta programlama tekniklerinden yararlandığından neredeyse emin olabilirsiniz. Zaman metaprogramming :(derlemek C++ bakarak artık zaman harcamak daha – UncleBens

+1

İsa, doğrusu seni gerek şey kopyalayıp, bunu kopyalamak lazım., prolog programlama 10 ömür geçirmek istiyorum, sen yapabileceğiniz düşünerek ondan alamıyorum Eğer siz kopyalanacak değişkenleri teşhis edebilirim sırf derleme zamanında –

+0

@Hassan: veri türleri ve hizalama bağlı olarak, kopyalama için farklı stratejiler olsa uygun olabilir ve kadar dramatik operasyonu hızlandırmak mümkün olabilir it. "sadece bir kopya" değildir. (Ama @UncleBens'in dediği gibi, 'std :: copy' zaten bunu yapar) – jalf

cevap

8

Bu daha iyi değil. Her şeyden önce, burada fonksiyon çağrılar yaptığınız için, gerçekten derleme zamanı değil. Şansınız varsa, derleyici bunları satır içi ve bir döngü ile sona erecek ve daha az kodla yazabilirsiniz (ya da sadece std::copy'u kullanarak).

+3

+1 f * ck evet! ! – Tom

+2

Bu doğru değil. Yineleme derleme zamanıdır, burada çalışma zamanı özeti yoktur. Her işlev farklı bir sınıfa ait ve aynı işlevde değil. Ne olsa Java için doğru olurdu! – PierreBdR

+2

@PierreBdr, her seferinde farklı bir işlevin dahil olduğu doğrudur. Ancak bu çalışma zamanında yapılan işlev çağrıları vardır ve etkisi aksine size (bir özyinelemeli şekilde aynı işlevi çağırır sanki olduğunu * gerçek * zaman tekrarlama ala derleme' 'static int const değeri = Sınıf :: değer + 1'e ; '). Tek fark, uç durumun derleme zamanında değerlendirilebilmesidir. Ancak eşdeğer bir döngü durumu da olabilir. –

0

Bunu yapmamalısınız. Şablonlar farklı amaçlar için icat edilmiştir, bunu yapabilmenize rağmen, hesaplamalar için değil. Önce değişkenleri kullanamaz, ikinci şablonları derleme kullanılmayan yapıların geniş üretecek ve üçüncü geçerli: çalışma zamanında bilinen şeyler için satır içi uygulaması kullanmak, derleme zamanında bilinen şeyler için kullanın şablonları: for (int i = start; i <= end; i++) b[i] = a[i];

+1

Evet, şablonlar farklı amaçlarla icat edildi, ancak bu ikinci amaçsız kullanım için kaç kitap yazıldığını ve e-mürekkep kullanıldığını hayal edemezsiniz! – cibercitizen1

+0

Evet, doğrulayamadığınız şablonlarla ilgili iddialarda bulunmayın. –

1

Genel kural kullanabilirsiniz. Dizininizin boyutunu derleme zamanında bilmiyorsanız, bunun için şablon kullanmayın. kontrol ve kendiniz döngü sarılmasını zorlamak çünkü iyi

0

.

Bir döngü ... optimize seçeneklere bağlı derleyici tarafından

copy ile kopyalama neredeyse iyi döngü seçemeden hesaplama ne olursa olsun yapılabilir çünkü iyi bir genel cevap değil aslında, aýlabilir İçinde ...