2016-07-08 217 views
0

有一個輕量級類在代碼中起着核心作用。實際上,有兩種變體(例如,V0V1);都有方法do_it()。此方法在V0V1中大約需要10個浮點運算(FPO)。這是一個很小的數字,但do_it()一直被調用,總體來說這些調用佔用了執行時間的30% - 70%。C++:模板的替代解決方案

在我目前的實施V0V1是依賴於他們如此的do_it()正確的變體在編譯時決定的所有其他類模板參數。

的問題基本上是任何類代碼使用V或使用使用V,所以在實踐中所有的類都是模板類。隨着時間的推移,它變得有點煩人,很難維護。

我可以使用C++的其他機制來代替模板嗎?任何人都可以估計這種情況下的開銷嗎?當然,我會好好學習的實際數字,當我重寫代碼,但是這是一個相當投資

編輯 也讓我提供了一個(非常簡化的)例子:

假設V0V1是點在二維空間。 V0在一個平面上,並且在球體上有V1do_it()是計算點之間並在V0的情況下的距離的方法是比V1

快得多然後,我有類例如Points<V>其中從std::vector<V>繼承,RandomWalk<V>,保持一個參考Points<V>,大量的分析代碼等plot_distribution<V>(Points<V>)

也許在未來的某個時刻,用戶將被允許提供其自己的幾何形狀例如一個圓環。但是到目前爲止,只允許兩種幾何形狀,並且它們不會同時出現在程序中。

+0

這是爲什麼這麼煩人?你把所有的東西都放在頭文件中嗎? –

+0

是的,如果* .hh中的代碼爲90%。我不喜歡它。 – tnorgd

+2

您可以將方法定義移動到cpp文件,並顯式實例化所有內容。對於每個類模板,只需要兩個實例,即「someclass '和'someclass '。 –

回答

3

好的舊宏仍然完全可用。

#define NS NS_ ## VARIANT; 

namespace NS 
{ 
    using Variant = VARIANT; 

    class Foo 
    { 
    Variant* v; 
    // etc 
    }; 
    // everything goes here 

} 

現在用-DVARIANT與-DVARIANT編譯整個項目兩次,一次= V0,一旦= V1。沒有開銷!

+0

我同意* old * ... :-) – skypjack

0

如果你知道你的模板參數將被限制在某些類(比如V0V1),那麼你可以文件移到你的所有的模板代碼的.cpp正常,並得到它鏈接如下...

頭(.h)

template<class T> 
class Foo 
{ 
public: 
    void Do(); 
}; 

實現(的.cpp)

template<class T> 
void Foo::Do() 
{ 
    ///do stuff... 
} 

//this creates two entries in the object code for link time resolution of Foo<V0> and Foo<V1> but Foo<anything else> will fail to link 
template class Foo<V0>; 
template class Foo<V1>;