2009. 7. 25. 12:30

반환값 최적화 (return value optimization)

값 반환시 생성자를 사용하는 코드와 그렇지 않은 코드의 차이점을 살펴보자.

class Int {

public:

        Int(int num=0) : _num(num) {

               cout << "constructed" << endl;

        }

        Int(const Int & copy)

        {

               cout << "constructed" << endl;

               _num = copy._num;

        }

 

// friend

        friend const Int operator*(const Int & lhs, const Int & rhs);

private:

        int _num;

};


Int 를 테스트하는 코드는 다음과 같다.

Int a = 10;

Int b = 2;

 

Int c = a * b;


operator* 를 구현함에 있어 지역 객체를 먼저 선언하여 반환하는 경우와 생성자를 통하여 바로 반환하는 경우를 살펴보자.

+. 지역 객체를 생성하여 반환하는 경우

const Int operator*(const Int & lhs, const Int & rhs)

{

        Int temp;

        temp._num = lhs._num * rhs._num;

 

        return temp;

}



이 때 테스트 코드를 수행하면 Int 객체가 4번 생성된다. 실행결과를 캡처한 화면이다.


+. 생성자를 이용하여 바로 반환하는 경우

const Int operator*(const Int & lhs, const Int & rhs)

{

        return Int(lhs._num * rhs._num);

}



이 때는 반환값 최적화가 수행되어 임시객체가 생성되지 않는다.

아래는 캡처한 화면.


효율성이 중시되는 경우 이런 임시 객체 생성은 무시할수 없을 것이다.

참고 : More Effective C++