반응형
RVO 가 일어나게 되면, 앞서 배웠던 소유권의 이전(move)이 발생할 필요 없이 0 copy 를 달성해 낼 수 있다.
함수의 return 값을 value로 하게 되면(return by value) RVO가 개입되며 가장 효율적인 할당을 해낼 수 있다는 것이다.
다음의 코드를 보면,
프로세스는 이렇게 진행될 것이라 생각하기 쉽다.
심지어 이럴 때 std:move() 를 사용해서 copy를 없애주고자 하는 사람도 있다. 하지만, 실제로는 RVO가 개입된다.
: 실제로 컴파일러는 Return Value Address가 a를 가리키고 있다는 것을 알고 있다.
따라서 결국 함수공간 안에 힙 공간에 문자열을 만들고 a가 직접 이 공간을 가리키도록 만들어 놓는다.
함수가 끝나고 해제되며 우측 그림처럼 된다. RVO가 개입되면서 지역변수 s는 처음부터 존재하지도 않게 되며,
*0 Copy를 만들어 냈고
*지역변수 s가 만들어지지도 않았기에 소유권의 이동 move 조차도 필요가 없다.
대부분의 상황에서 RVO가 개입되지만 개입되지 않을때도 일반적으로는 0 copy가 되기 때문에 굳이 함수를 리턴할 때 std::move()를 붙여줄 필요가 없다.
더 자세한 설명은 cppreference의 copy elision 참고.
https://en.cppreference.com/w/cpp/language/copy_elision
반응형
'모던C++ > Resource move' 카테고리의 다른 글
3. std::move() 이해하기 - resource 최적화, 0 copy (0) | 2022.07.22 |
---|---|
2. L-value, R-value - 0copy 만들기 (0) | 2022.07.21 |
1. 포인터와 레퍼런스, Pass by Value (0) | 2022.07.17 |