C++中按值返回和返回值優(yōu)化代碼

字號:

C++和C語言相比,最為人詬病的就是其性能問題,通常一條C語言經(jīng)編譯器解釋后,可以固定轉(zhuǎn)換成5—10條匯編語言,但是一條C++語言,就沒有這么幸運了,可能會是3條匯編語言,也可能是300條。C++影響性能的原因很多,其中一個就是臨時對象的創(chuàng)建和銷毀??荚嚧筇崾?這里我簡述一種減少創(chuàng)建臨時對象的方法--返回值優(yōu)化問題
    很多時候,函數(shù)需要按值返回,這其中就會不可避免地涉及到臨時對象的創(chuàng)建和銷毀。假設定義如下的Complex類:
    class Complex
    {
    friend Complex operator +(const Complex&,const Complex&);
    public:
    Complex(double r=0, double i=0):real(r),imag(i)
    {
    cout<<\"I\'m in constructor\"<    }
    Complex(const Complex& c):real(c.real),imag(c.imag)
    {
    cout<<\"I\'m in copy constructor\"<    }
    Complex& operator =(const Complex& c)
    {
    real=c.real;
    imag=c.imag;
    cout<<\"I\'m in assignment\"<    return *this;
    }
    void print()
    {
    cout<    }
    ~Complex()
    {
    cout<<\"I\'m in destructor\"<    }
    private:
    double real;
    double imag;
    };
    Complex operator +(const Complex& a,const Complex& b)
    {
    /*Complex retVal;
    retVal.real=a.real+b.real;
    retVal.imag=a.imag+b.imag;
    return retVal;*/
    cout<<\"calling plus\"<    // return Complex(a.real+b.real,a.imag+b.imag);
    Complex retVal(a.real+b.real,a.imag+b.imag);
    return retVal;
    }
    其中的友元函數(shù)operator + 是一個按值返回的函數(shù)??荚嚧筇崾?編譯器會將這個函數(shù)解釋成如下:
    void Complex_Add(const Complex& __result,
    const Complex& c1,
    const Complex& c2)
    {
    ......
    }
    定義一下語句:Complex a(1,1),b(2,2),c;
    c=a+b;
    a和b相加的結(jié)果賦值給對象c的過程,可以被轉(zhuǎn)化為:
    Complex __tempResult;
    Complex_Add(__tempResult, a,b);
    c=__tempResult;