다음과 같은 코드를 짰을 때, 컴파일러가 알아서 만들어주는 메소드들이 있다. 1. Constructor 2. Destructor 3. copy/move Constructor 4. copy/move Assignment : 일반적으로 Constructor는 직접 만들어주고 destructor을 포함한 나머지 5가지 메소드들은 직접 만들어주지 않는다. but 이렇게 포인터를 활용해서 리소스를 관리하게 되면 개발자가 직접 이 5가지의 메소드를 관리해 주어야 한다. 구글에서 c++ rule of three / rule of five 로 검색하게 되면 cppreference에서 관련 내용을 확인 가능하다. https://en.cppreference.com/w/cpp/language/rule_of_three The ..
Move
RVO 가 일어나게 되면, 앞서 배웠던 소유권의 이전(move)이 발생할 필요 없이 0 copy 를 달성해 낼 수 있다. 함수의 return 값을 value로 하게 되면(return by value) RVO가 개입되며 가장 효율적인 할당을 해낼 수 있다는 것이다. 다음의 코드를 보면, 프로세스는 이렇게 진행될 것이라 생각하기 쉽다. 심지어 이럴 때 std:move() 를 사용해서 copy를 없애주고자 하는 사람도 있다. 하지만, 실제로는 RVO가 개입된다. : 실제로 컴파일러는 Return Value Address가 a를 가리키고 있다는 것을 알고 있다. 따라서 결국 함수공간 안에 힙 공간에 문자열을 만들고 a가 직접 이 공간을 가리키도록 만들어 놓는다. 함수가 끝나고 해제되며 우측 그림처럼 된다. RV..