返回值優化,是一種屬於編譯器的技術,它通過轉換源代碼和對象的創建來加快源代碼的執行速度。
RVO = return value optimization。
class Complex//復數 { friendd Complex operator + (const Complex & , const Complex&); public: Conplex(double r=0.0,double i= 0.0): real(r),imag(i){} Complex(const Complex& a):real(a.real),imag(a.imag){}; Complex operator = (const Complex &a); ~Complex(); private: double real; double imag; };
對於執行 A=B+C;
的時候,編譯器在原函數創建一個臨時變量,作為第三個參數傳給 operator +(),使用引用傳遞,然后再將值賦給 A。
很多的編譯器都實現了這樣的優化,不過在程序編寫的時候需要注意某些細節,才能讓編譯器執行這一技術。如:
//不能使用RVO Complex operator +(const Complex & a, const Complex &b) { Complex retVal; retVal.real=a.real +b.real; retVal.imag=a.imag +b.imag; return retVal; } //能夠使用RVO Complex operator +(const Complex & a, const Complex &b) { double r=a.real +b.real; double i=a.imag +b.imag; return Complex(r,i); }
//不能使用RVO Complex operator +(const Complex & a, const Complex &b) { Complex C(a.real +b.real,a.imag +b.imag); return C; } //能夠使用RVO Complex operator +(const Complex & a, const Complex &b) { return C(a.real +b.real,a.imag +b.imag); }
另外,必須定義拷貝構造函數來“打開”RVO
另外還有一種是通過 夠着函數實現的,稱 計算性構造函數
//計算性構造函數 Complex operator +(const Complex& a, const Complex &b) { return Complex(a,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。