6월 09, 2016

copy elision ,RVO, NRVO

복사 및 이동 생성자를 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

댓글 없음:

댓글 쓰기