2011-04-03 36 views
11

您更喜歡哪一個? (當然的getSize不作任何複雜的計算,只是回覆構件值)重複呼叫 - 編碼練習

void method1(Object & o) 
{ 
    int size = o.getSize(); 

    someAction(size); 
    someOtherAction(size); 
} 

void method2(Object & o) 
{ 
    someAction(o.getSize()); 
    someOtherAction(o.getSize()); 
} 

我知道我可以衡量哪一個是快,但我想一些評論...不只是執行相關的時間...例如。如果您更喜歡method2,那麼您最多可以使用o.getSize多少次,以及使用method1方式的數量是多少? 任何最佳實踐? (想象即使是不同的類型,然後int) TY

+5

如果我要使用method1,我會使用一個const int來表示我不會更改函數中的值。 – Kleist 2011-04-03 08:53:23

回答

10

我會去的方法1不只是因爲它可能稍微更快,但主要是因爲這意味着我不必擔心被調用的方法是否有任何副作用。另外,如果在多線程程序中調用這個函數,這將確保我始終使用my值的大小 - 否則它可能在兩次調用之間發生變化。當然也有可能是在那裏你明確可能要注意到的變化的情況下,在這種情況下,使用方法2

(是的,每其他的答案,讓size一個const int,以確保它是否通過引用傳遞它沒有修改到別的東西)。

0

當結果不會改變時反覆調用任何函數是一種浪費,所以我總是會用第一種方法。

1

我寧願第一種方法。重複調用一個函數對我來說不太合適,特別是如果返回值每次都是相同的。第一種方法也避免了重複調用函數的開銷。

1

當我調用一個返回多次(大約2-3次以上)的函數時,我通常會將返回值保存在局部變量中。這是因爲我欣賞節目速度比節省內存更多。不是說記憶不重要。這隻取決於情況。調用一個不需要很多時間執行的函數並不耗費時間,但是一個被多次調用的循環的函數會將您的程序發送到很長的等待時間。

+0

這是開發的習慣,因爲否則你會錯過計算時間的明顯浪費,因爲你從不考慮它。例如調用sqrt(myvar)3次,因爲在公式中需要3次 – 2011-04-03 08:58:55

1

第一個將消除不必要的函數調用,因此我更喜歡method1(),因爲代碼看起來更乾淨。

但是,您應該意識到,根據上下文,它們可能會產生不同的結果。比如,如果someAction()中的大小發生變化,並且使用大小變量中存儲的值,則可能無法獲得所需的結果。

9

既然你不想size當你調用someAction()someOtherAction()(因爲它不能當它是一個函數的返回值),考慮改變:

void method3(const Object& o) 
{ 
    const int size = o.getSize(); 

    someAction(size); 
    someOtherAction(size); 
} 

getSize()可以是簡單的,或者它可能會進行昂貴的計算。此外,o的大小可能會由您撥打電話someAction()someOtherAction()之間的另一個線索更改。

+1

隨着時間的推移,getSize()函數可能會變得更加複雜。 – 2011-04-03 08:59:52

+1

或者一個const引用,如果它是非POD類型的話。 – 2011-04-03 09:00:30

+0

'o'應該是'const&',是的。 'size'應該是一個'const',即使它不是POD,因爲我們不希望它在對'someAction()'和'someOtherAction()'的調用之間改變。 – Johnsyweb 2012-10-24 11:18:16