2012-03-15 39 views
1

我有以下情況:這個函數調用會被g ++優化嗎?

void function(params) 
{ 
    #ifdef _MULTIPLAYER 
    if (isConnected) 
    { 
     if (isClient) 
     { 
     requestFunctionRemotely(params) 
     return; 
     } 
     else if (isServer) 
     { 
     call realFunction(params) remotely on client; 
     } 
    } 
    #endif 

    realFunction(params); 
} 

realFunction(params) 
{ 
    ... 
} 

在這種情況下,我能夠建立我的項目或者與單人遊戲實例或多人。

這種方法已經被使用,因爲function(params)被稱爲所有在我的代碼,所以在這種方式我只是連接到可能的最低水平,而不必問題。

我必須拆分functionrealFunction,因爲客戶端收到的遠程響應必須通過realFunction執行以避免循環(我可以更改函數原型來添加標誌,但是我會打破很多代碼)。

我的擔心與禁用_MULTIPLAYER定義時的性能有關。我有很多function(params),我會打電話給他們一千次。我必須爲他們所有人使用這種方法。將G ++優化掉了兩個人通話時,它會發現

function(params) { 
    realFunction(params); 
} 

function(params) { 
    // body of realFunction 
} 

並沒有辦法迫使它在每一個類似的情況?

只是作爲一個提示:我目前使用的-O2標誌

+2

你有沒有試過用-03編譯時查看反彙編? – 2012-03-15 00:23:07

+3

如果'realFunction'和'function'在同一個翻譯單元中,那麼是的,幾乎可以肯定。你試過了嗎? – 2012-03-15 00:24:37

+4

1.在我之後重複一遍:「我不比編譯器更聰明,我不會試圖優化編譯器,直到我的應用程序變得太慢,我纔會在編譯器優化級別上擔心性能。 2.轉到1 – John3136 2012-03-15 00:28:17

回答

3

如果您想確保可以反轉模式並使用模板參數。這樣你就可以確定編譯器會在編譯時刪除if (false)

template <bool isMulti> 
void Function(params) 
{ 
    if (isMulti) 
     MultiFunction(); 

    // real function code 
} 

void MultiFunction(params) 
{ } 

注:

如果帶班工作,你可以在模板參數向上移至類簡潔。

1

這很難說,但是這通常應優化(你永遠不能肯定,你能做的就是給它一些提示最好的,例如,通過使用inline,但編譯器通常會嘗試自己找到最佳解決方案(也基於「優化大小」與「優化速度」,同時忽略了您的提示(他們不必爲此做出))

可能最好的(也是最簡單的)解決方案將以避免這種競爭的方式編寫代碼,例如像這樣的:

type function(params) 
{ 
#ifdef _MULTIPLAYER 
    if(client) 
    { 
     // call server 
    } 
    else 
#endif 
    { // this bracket will be ignored, but saves adding another `#ifdef..#endif` block just to close it again below 
     // do stuff here 
    } 
}