2013-07-30 23 views
1

我有一個代碼性能和可讀性上反覆功能

void Foo() 
{ 
    auto index = currentIndex(); 
    if (index.isValid()) 
     index.doSomething(); 
} 

另一種選擇

void Foo() 
{ 
    if (currentIndex().isValid()) 
     currentIndex().doSomething(); 
} 

第二個對我來說更具有可讀性。但它的表現如何? currentIndex()在當前流行的編譯器中計算兩次嗎?如果currentIndex()是一個佔用CPU時間的大函數,編譯器是否會優化第二個作爲第一個?

+1

變量名'index'很清楚.. – Rapptz

+0

'currentIndex()'返回什麼?第一個和第二個例子看起來不一樣。 –

+0

是的,currentIndex()將在第二個解決方案中調用兩次 –

回答

1

第一個可能會有更好的性能,而IMO更具可讀性,因爲如果你自己打電話給currentIndex(),你就沒有任何信息。如果你將它分配給一個變量,你有它將來使用。

編譯器就沒有機會優化召喚出來的,原因是多方面

  1. 第一個電話可能已經改變了下一個調用的結果
  2. 功能的有2個呼叫可改你的程序的狀態
  3. 可能是其他原因一大堆我想不出

所以在最後,沒有理由你不使用的第一個版本,我可以保證大多數人也會發現該版本更具可讀性。將數據分配給名字是現代程序設計的基石之一,因此,如果數據沒有名字時,數據更具可讀性,您可能需要習慣變量名稱

另一個說明,爲了使它更加可讀不使用自動,這更好地保存模板編程,其中類型可能是一個痛苦找出你自己的。

+0

好,隨機答覆問題後的dv個月 – aaronman

0

對我而言,第一個選項不會在表演中留下任何問題,這是我更喜歡的。

這就是說,這一切都取決於上下文,用法和currentIndex()的成本。如果currentIndex()是一個微不足道的getter,並且Foo()在某個重循環中沒有被調用,那麼幾乎沒有什麼區別。

+0

我認爲問題實際上是編譯器是否會優化第二個調用(我說不是)不會調用它兩次更糟糕,只是一個人擡頭,所以你不會得到downvoted :) – aaronman