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;
很多時候,函數(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\"<
}
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\"<
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;