3. Implementation/C / C++
반환값 최적화 (return value optimization)
SSKK
2009. 7. 25. 12:30
값 반환시 생성자를 사용하는 코드와 그렇지 않은 코드의 차이점을 살펴보자.
Int 를 테스트하는 코드는 다음과 같다.
operator* 를 구현함에 있어 지역 객체를 먼저 선언하여 반환하는 경우와 생성자를 통하여 바로 반환하는 경우를 살펴보자.
+. 지역 객체를 생성하여 반환하는 경우
이 때 테스트 코드를 수행하면 Int 객체가 4번 생성된다. 실행결과를 캡처한 화면이다.
+. 생성자를 이용하여 바로 반환하는 경우
이 때는 반환값 최적화가 수행되어 임시객체가 생성되지 않는다.
아래는 캡처한 화면.
효율성이 중시되는 경우 이런 임시 객체 생성은 무시할수 없을 것이다.
참고 : More Effective C++
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++