c/c++:efficient c++,返回值優化,RVO


返回值優化,是一種屬於編譯器的技術,它通過轉換源代碼和對象的創建來加快源代碼的執行速度。

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。

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM