2014-10-06 35 views
1

這兩個代碼之間存在相當大的優化差異(在Java和/或C++中,當前,即使我猜它在每種語言中都是一樣的)?還是僅僅是代碼可讀性問題?使用多個返回語句

int foo(...) { 
    if (cond) { 
     if (otherCondA) 
      return 1; 
     if (otherCondB) 
      return 2; 
     return 3; 
    } 
    int temp = /* context and/or param-dependent */; 
    if (otherCondA) 
     return 4 * temp; 
    if (otherCondB) 
     return 4/temp; 
    return 4 % temp; 
} 

int foo(...) { 
    int value = 0; 
    if (cond) { 
     if (otherCondA) 
      value = 1; 
     else if (otherCondB) 
      value = 2; 
     else value = 3; 
    } 
    else { 
     int temp = /* context and/or param-dependent */; 
     if (otherCondA) 
      value = 4 * temp; 
     else if (otherCondB) 
      value = 4/temp; 
     else 
      value = 4 % temp; 
    } 
    return value; 
} 

第一個是短,避免else語句的多個鱗狀部,節約一個變量(或者至少看起來這樣做),但我不知道它真的改變了一些東西...

+0

你不確定這是個好主意......爲什麼?你有沒有任何理性的原因呢?或者你今天早上醒來就是這樣嗎?您是否嘗試檢查生成的代碼或使用分析工具? – 2014-10-06 16:51:41

+0

許多人主張單一'返回',因爲他們認爲代碼更容易通過。即使我遵循這個建議,當前提條件失敗時,我也允許在函數前面提前返回。 – 2014-10-06 17:09:41

+0

經過幾次測試之後,編譯器只能優化MarkRansom談到的多重返回語句的種類。在函數中間,優化非常差。 – 2014-10-06 17:28:19

回答

1

停止程序尋求更深入的GCC產生不同的彙編代碼後,這裏的結果:

的多個return語句中的「正常」的編寫更高效,但帶有-O_標誌,餘額變化爲:

您越是優化代碼,第一種方法的價值就越低。它使代碼難以優化,因此請謹慎使用它。正如評論所說,在測試前提條件時,它在功能的前面使用時功能非常強大,但在函數的中間,這對編譯器來說是一場噩夢。

0

當然,多重回報是可以接受的。 因爲你可以儘快功能完成