2013-03-09 37 views
1

在我的應用程序中,通過引入結構的特殊情況,我獲得了大約2倍的加速。優化性能,同時減少使用模板

,簡體中文,我的代碼看起來是這樣的:

class SpecialCase 
{ 
    private: 
     size_t values[10]; 
    public: 
     void foo(); 
}; 

class GenericCase 
{ 
    private: 
     std::vector<size_t> values; 
    public: 
     void foo(); 
}; 

template <class Case> void bar() 
{ 
    Case case; 
    case.foo(); 
} 

void somewhereElse() 
{ 
    if (boring_runtime_condition) 
    { 
     bar<SpecialCase>(); 
    } 
    else 
    { 
     bar<GenericCase>(); 
    } 
} 

有此位的代碼沒有問題,但現在我有另一個類來擴展應用程序:

class Problem 
{ 
    private: 
     std::vector<Case> cases; 
    public: 
     Case doSomething(); 
}; 

若要與SpecialCase和GenericCase我都必須使整個類都成爲一個模板。由於我有幾個特殊情況,這大大減慢了編譯速度。我根本不喜歡那樣。

我從不在應用程序的運行中混合使用SpecialCase和GenericCase。我非常希望不必在每種方法中將我的Case投入到特定類型,因爲它膨脹了代碼,其他開發人員可能會忘記它。

是否有避免這種模板瘋狂的好方法? (也歡迎C++ 11解決方案)

聲明:請不要告訴我std::vector有多好,我不應該使用特殊情況。我衡量的性能,所以請不要留下你不相信2倍加速的評論。這是事實,這個問題不是關於它的。

+0

使用它不應該的'兩個分支,如果(boring_runtime_condition)交換? – 2013-03-09 11:08:53

+0

@AndyProwl爲什麼會這麼重要?它是過於簡化的僞代碼。 – stefan 2013-03-09 11:10:02

+0

沒關係。我只是想從中解脫出來 – 2013-03-09 11:11:01

回答

0

如果您不想創建大量的std::vector實例,您可以創建一個小型代理類,它通過引用存儲所有內容並僅在此類中進行投射。如果它很小,實例化不會太慢。

template<class T> 
class Problem { 
    private: 
     std::vector<some_smart_pointer> cases; 
    public: 
     T cast(Case* x) { 
      return (T*)x; 
     } 
     T doSomething() { 
      //doing something 
       return cast(returnValue); 
     } 
}; 

我叫類Problem,但是這是更好地使該只用來作爲代理一些其他層ProxyVectorProblem