Skip to content

Instantly share code, notes, and snippets.

@superlayone
Last active August 29, 2015 14:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save superlayone/efedde15efd948c8d8b6 to your computer and use it in GitHub Desktop.
Save superlayone/efedde15efd948c8d8b6 to your computer and use it in GitHub Desktop.
Return value optimization

###Return value optimization

我们知道,在函数内如果需要以value方式返回对象,那么需要生成临时匿名对象,然后以这个临时对象去通过copy构造函数生成新的对象,最后调用析构函数销毁对象

    A method(){
        ...
        A temp;
        ...
        return temp;
    }

然而经过测试,这个过程已经被编译器优化了,这个过程叫做return value optimization,1996年ISO/ANSI委员会宣布,匿名对象和命名对象均可以通过这个方式优化,所以我们会看到编译器会直接以返回值作为参数通过构造函数构造新的对象,不再生成临时对象,代码如下:

    #include <iostream>
    using namespace std;
    class Rational{
    public:
    	Rational(int numer = 0,int denominator=1){
    		cout<<"Constructor...\n";
    		this->_numer = numer;
    		this->_denom = denominator;
    	}
    	Rational(const Rational& r){
    		cout<<"Copy constructor...\n";
    	}
    	int numerator() const;
    	int denominator() const;
    	const Rational operator*(const Rational& rhs){
    		return Rational(this->numerator()*rhs.numerator(),this->denominator()*rhs.denominator());
    	}
    	friend const Rational operator*(const Rational& lhs,const Rational& rhs){
    		cout<<"Operation * ...\n";
    		return Rational(lhs.numerator()*rhs.numerator(),lhs.denominator()*rhs.denominator());
    	}
    	~Rational(){
    		cout<<"Destructor...\n";
    	}
    private:
    	int _numer;
    	int _denom;
    };
    int Rational::numerator() const{
    	return this->_numer;
    }
    int Rational::denominator() const{
    	return this->_denom;
    }
    
    void Testing(){
    	Rational a = 10;
    	Rational b(1,2);
    	Rational c = a*b;
    }
    int main()
    {
    	Testing();
    	system("pause");
    	return 0;
    }
    
###Testing

此处输入图片的描述

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment