返回值優化問題

2021-04-19 22:02:27 字數 1248 閱讀 8965

近來看到小李子寫了篇blog,題目為返回值優化。

文章如下。 

return integer(left.i+right.i); //建立乙個臨時物件並返回他,不會呼叫析構函式,效率高。

interger tmp(left.i+right.i);

return tmp;              //建立了區域性物件,有析構函式。

這裡感覺有些詭異。

於是編寫了簡單的程式

// #include "stdafx.h"

#include 

using

namespace std;

class a

~a()

};a& foo1(int c)

a foo2(int c)

a foo3(int c)

a& foo4(int c)

int _tmain(int argc, _tchar* argv)

最後的執行結果是:

aa:1

foo1

aa:2

foo2

aa:3

aa:3

foo3

aa:4

foo4

aa:1

aa:3

aa:4

aa:3

aa:2

當然前面的內容:

aa:1

foo1

aa:2

foo2

aa:3

aa:3

foo3

aa:4

foo4

第二個函式與第三個函式可以很明顯的看到效率的差異。因為foo3函式中析構函式出現了兩次。

(這裡第一和第四個函式有明顯錯誤,可以根據後面的測試程式看出)

但是第乙個函式也恰恰說明return integer(left.i+right.i); //建立乙個臨時物件並返回他,不會呼叫析構函式,效率高。

這句話有些問題。因為在除錯的時候可以看出有呼叫析構函式。並且結果

aa:1

aa:3

aa:4

aa:3

aa:2

也能說明問題。

由於第乙個函式和第四個函式產生的效果一樣。

所以我提出乙個可能的假設:

return integer(left.i+right.i); 只有當返回值為integer,而非integer&才能有建立乙個臨時物件並返回他,不會呼叫析構函式。

當然因為程式的正確性要求,我們不可能編寫類似於foo1的函式。

返回值優化問題

近來看到小李子寫了篇blog,題目為返回值優化。文章如下。return integer left.i right.i 建立乙個臨時物件並返回他,不會呼叫析構函式,效率高。interger tmp left.i right.i return tmp 建立了區域性物件,有析構函式。這裡感覺有些詭異。於是...

返回值優化

通過傳值方式返回要建立新物件時,應注意使用的形式,例如在operator return integer left.l right.l 咋看起來這像是乙個 對乙個建構函式的呼叫 其實並非如此。這是臨時物件語法,它是在說 建立乙個臨時integer物件並返回它 據此我們可能認為如果建立乙個有名字的區域性...

返回值優化

返回值優化,是一種屬於編譯器的技術,它通過轉換源 和物件的建立來加快源 的執行速度。rvo return value optimization。class complex 複數 complex const complex a real a.real imag a.imag complex opera...