我必須調用f(0)
和f(1)
傳遞常數。
參數(0
和1
)被用於僅在開關的情況下(一個或多個)。
如何強制/導向編譯器優化出的switch-case(從「昂貴」到「便宜」下面版本)儘可能?優化開關(x)中,x是作爲參數
從godbolt demo,開關情況下的未優化的。
例子:昂貴
int f(int n) {
switch(n) {
case 0: {
return 5;
};break;
case 1: {
return 10;
};break;
}
return 15;
}
int main(){
f(0);
}
例子:價格便宜(我的夢想)
int f0(){
return 5;
}
int f1(){
return 10;
}
int main(){
f0();
}
的更多信息: -
在實際情況中,有超過只有0和1 - 他們是枚舉類。
參數總是恆定在用戶的方面例如f(CALLBACK_BEGIN)
,f(CALLBACK_END)
。
爲什麼我不能只是f0()/ f1()?
我想將它分組爲單個函數,因爲我有時想創建一個傳遞函數。這是比較容易維護,如果我可以編寫它像: -
int g(int n){ .... }
int f(int n){ return g(n); }
這是比較容易維護比: -
int g0(){ .... } int g1(){ .... }
int f0(){ return g0(); }
int f1(){ return g1(); }
我也喜歡避免模板,所以我不能使用的解決方案Optimize Template replacement of a switch。我的理由是: -
- 模板必須在標頭中實現。
- 我需要它在
.cpp
,所以我不得不間接它到另一個非模板函數。
它變髒非常快。
過早優化?
在我的情況下,它被稱爲60 * 10000 +次/秒。
編輯
我誤解了godbolt演示的結果。它實際上是優化的。
(感謝M.M和伯努瓦指出來。)
EDIT2
接收兩個偉大的答案後,我測試了一下,發現的Visual C++是非常聰明的。
它可以優化的東西,如: -
int f(int p1,int p2){
if(p1==0 && p2==1){ //zero cost
}
}
f(0,1); //inside main
在現實情況下,有功能的間接3-5層,但Visual C++仍然可以找到!
的結果是類似的職位是一致的:Constant condition in a loop: compiler optimization
你godbolt顯示呼叫到f(0)是優化離開 –
@Benoît可恥的我!我對編譯語言(彙編)非常陌生。 – cppBeginner
只要確保f被定義爲內嵌在你的頭部之一中。 –