2013-10-02 64 views
0

以下模板轉乘FUNC <7>(42)和FUNC(42,7)模板參數語法

template<typename Data, typename Number> 
int compute(Data d, Number n) { 
    if(n > 10) SLOW(d) 
    if(n < 30) EXPENSIVE(d) 
    if(n < -10) .. if(..) // etc. 
    return d.abc(); 
} 

有時也被稱爲具有動態計算Number ncompute(data, runtime_number), 和有時與編譯時已知參數: compute(data, 3)

如果我不相信編譯器優化後一種情況(有或沒有內聯),但相信它足以使if(false)塊消失,我將不得不復制大量代碼並編寫compute<12>(data)模板。除了代碼重複之外,compute(data, number)只是更好,更直觀。

有沒有辦法統一這兩個?

編輯:這更多的是模板,或模板濫用,如果你會,比對優化編譯器可以適用於這種情況。

+2

我看到它的方式,在這裏沒有太多的優化。在最糟糕的情況下,你會得到一些額外的常量比較(每個循環1次),也可能是一個或兩個分支。由於您提到函數「SLOW」和「EXPENSIVE」被調用取決於結果,這些優化根本沒有任何區別。 – us2012

+0

對,這些功能較少,更多關於從代碼中移除if()...塊。除了輕量級比較函數外,還有分支預測失誤的代價:有很多'if'子句(沒有'else'!),並且這個函數經常被調用。 – toting

+0

如果SLOW和EXPENSIVE是純函數,也許可以緩存結果。 – jcarpenter2

回答

1

什麼都不做。編譯器足夠優化所有東西。