복사 및 이동 생성자를 zero-copy pass-by-value (무복사 값에 의한 전달)로 최적화 하는 것. 특정 상황(아래 서술)에서 객체의 복사 및 이동 생성자를 생략함. 함수의 return 문과 관련되는 경우 이를 RVO(return by value, return의 argument가 생성자인 경우), NRVO(return by value, 함수 내 local variable을 반환하는 경우) 등으로 부르기도 함.
RVO (Return Value Optimization)
어떤 reference에도 bound되지 않은 nameless temporary 가 복사/이동될 때, 복사/이동 생성자가 생략되고 대신 복사/이동하려는 공간에 직접(바로) 할당됨. nameless temporary 가 return 문의 argument인 경우, 이러한 copy elision을 RVO라 부른다.
NRVO (Named Return Value Optimization)
vs2005부터는 이름있는 변수에도 RVO가 적용되기 시작함.
함수가 class type을 값으로 반환하고, 반환문의 expression이 함수의 파라미터나 catch-cluase의 파라미터가 아닐 때, 복사/이동 생성자가 생략되고 대신 복사/이동하려는 공간에 직접(바로) 할당됨. nameless temporary 가 return 문의 argument인 경우, 이러한 copy elision을 NRVO라 부른다.
단, NRVO는 non-debug mode(release mode), 최적화 옵션 /O1에서부터 적용됨.
사용 방법
return에 move(..)를 사용하지 않는다. 기본 implementaion은 다음과 같음.
- X에 copy 또는 move constructor가 있으면, 컴파일러가 copy elision을 수행할 수 있음.
- 이외의 경우, X에 move constructor가 있으면, move constructor가 실행됨.
- 이외의 경우, X에 copy constructor가 있으면, copy constructor가 실행됨.
- 이외의 경우, 컴파일 타임 에러가 생략됨.
주의
만약 if 문과 같이 multiple return paths를 갖는 경우 (N)RVO가 수행되지 않음. 그 밖에 컴파일러에 따라 디버그 모드 등 특정한 상황에서 copy elision을 수행하지 않으므로 주의해야 함.
example
  
왼쪽: result in debug mode, 오른쪽: result in non-debug mode(release mode) with /O1 option
reference
- copy elision |cppreference.com
- C++ Returning reference to local variable |stackoverflow.com
- Return value optimiztion (RVO) |tistory:수까락
- [Modern C++ 프로그래머를 위한 안내서] Return value optimization
- Don’t be Afraid of Returning by Value, Know the Return Value Optimization
- Resource Acquisition Is Initialization |Wiki
- Named Return Value Optimization in Visual C++ 2005 |MSDN
- MSDN search
- he C++ Standard Library - A Tutorial and Reference by Nicolai M. Josuttis
댓글 없음:
댓글 쓰기