返回值優化,是一種屬於編譯器的技術,它通過轉換源**和物件的建立來加快源**的執行速度。
rvo = return value optimization。
class complex//對於執行 a=b+c;複數 complex(
const complex&a):real(a.real),imag(a.imag){};
complex
operator = (const complex &a);
~complex();
private
:
double
real;
double
imag;
};
的時候,編譯器在原函式建立乙個臨時變數,作為第三個引數傳給 operator +(),使用引用傳遞,然後再將值賦給 a。
很多的編譯器都實現了這樣的優化,不過在程式編寫的時候需要注意某些細節,才能讓編譯器執行這一技術。如:
//不能使用rvo
complex operator +(const complex & a, const complex &b)
//能夠使用rvo
complex operator +(const complex & a, const complex &b)
//另外,必須定義拷貝建構函式來「開啟」rvo不能使用rvo
complex operator +(const complex & a, const complex &b)
//能夠使用rvo
complex operator +(const complex & a, const complex &b)
另外還有一種是通過 夠著函式實現的,稱 計算性建構函式
//要點:計算性建構函式
complex operator +(const complex& a, const complex &b)
complex::complex(
const complex &a ,const complex &b):real(a.real +b.real),imag(a.imag +b.imag){}
1.如果必須按值返回函式,通過rvo可以省去建立和銷毀區域性物件的步驟。
2.rvo 的應用要遵照編譯器的實現而定。
3.通過編寫計算性函式可以更好的使用rvo。
返回值優化
通過傳值方式返回要建立新物件時,應注意使用的形式,例如在operator return integer left.l right.l 咋看起來這像是乙個 對乙個建構函式的呼叫 其實並非如此。這是臨時物件語法,它是在說 建立乙個臨時integer物件並返回它 據此我們可能認為如果建立乙個有名字的區域性...
返回值優化問題
近來看到小李子寫了篇blog,題目為返回值優化。文章如下。return integer left.i right.i 建立乙個臨時物件並返回他,不會呼叫析構函式,效率高。interger tmp left.i right.i return tmp 建立了區域性物件,有析構函式。這裡感覺有些詭異。於是...
C 返回值優化
當函式需要返回物件時,通常有兩種寫法,一種是直接在return語句中返回乙個物件,一種是先構造好乙個物件,然後在return中將其返回。以下 為例 include include using namespace std struct node node const node n name n.nam...