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 n
:compute(data, runtime_number)
, 和有時與編譯時已知參數: compute(data, 3)
。
如果我不相信編譯器優化後一種情況(有或沒有內聯),但相信它足以使if(false)
塊消失,我將不得不復制大量代碼並編寫compute<12>(data)
模板。除了代碼重複之外,compute(data, number)
只是更好,更直觀。
有沒有辦法統一這兩個?
編輯:這更多的是模板,或模板濫用,如果你會,比對優化編譯器可以適用於這種情況。
我看到它的方式,在這裏沒有太多的優化。在最糟糕的情況下,你會得到一些額外的常量比較(每個循環1次),也可能是一個或兩個分支。由於您提到函數「SLOW」和「EXPENSIVE」被調用取決於結果,這些優化根本沒有任何區別。 – us2012
對,這些功能較少,更多關於從代碼中移除if()...塊。除了輕量級比較函數外,還有分支預測失誤的代價:有很多'if'子句(沒有'else'!),並且這個函數經常被調用。 – toting
如果SLOW和EXPENSIVE是純函數,也許可以緩存結果。 – jcarpenter2