RVO 가 일어나게 되면, 앞서 배웠던 소유권의 이전(move)이 발생할 필요 없이 0 copy 를 달성해 낼 수 있다. 함수의 return 값을 value로 하게 되면(return by value) RVO가 개입되며 가장 효율적인 할당을 해낼 수 있다는 것이다. 다음의 코드를 보면, 프로세스는 이렇게 진행될 것이라 생각하기 쉽다. 심지어 이럴 때 std:move() 를 사용해서 copy를 없애주고자 하는 사람도 있다. 하지만, 실제로는 RVO가 개입된다. : 실제로 컴파일러는 Return Value Address가 a를 가리키고 있다는 것을 알고 있다. 따라서 결국 함수공간 안에 힙 공간에 문자열을 만들고 a가 직접 이 공간을 가리키도록 만들어 놓는다. 함수가 끝나고 해제되며 우측 그림처럼 된다. RV..
모던C++/Resource move
예제 1 이를 그림과 함께 설명해보면, 1) 스택에 a가, 힙에 "Headless" 가 존재한다. 2) 스택에 string object b 가 올라가면서 move()를 통해서 b가 "Headless"를 가리키게 된다. (a의 소유권이 이전됨) 3) b를 출력하게 되면 "Healess"가 출력되고, 이후 a를 출력하게 되면 a는 아무 것도 가리키지 않기 때문에 출력값이 비어있게 된다. 즉, move() 키워드는 Lvalue를 Rvalue로 바꾸면서 resource ownership 을 다른 object에게 넘겨줄 수 있다는 것이다. 이 예제에서는 a가 가지고 있던 힙 공간에 "Headless"의 ownership을 move() 명령어를 통해서 b에 넘겨준 것이다. 예제 2 함수를 콜 했을 때 레퍼런스를 넘..
1. L-value, R-value란? 다시 한 번 부를 수 있으면 Lvalue 한 번만 쓰이고 다시 불릴 수 없으면 Rvalue std::string S = "abc"; 같은 경우에도 S값은 나중에 다시 부를 수 있기 때문에 Lvalue, "abc"는 이 명령어에서만 쓰이고 다시는 쓰이지 않기 때문에 Rvalue. 더 자세한 설명은 다른 분들이 잘 정리해 주셨으니 참고할 것. https://effort4137.tistory.com/entry/Lvalue-Rvalue Lvalue Rvalue C++ Lvalue와 Rvalue에 대한 오해 Lvalue와 Rvalue는 보통 Left-value(왼쪽값)과 Right-value(오른쪽값)로 풀어서 씁니다. 이 때문에 대입 연산자(=)를 기준으로 왼쪽에 위치하는..
1. Pass by Value a 가 Pass by Value 되며 카피되면서 foo 에 a=0 이 들어가게 되고, 로컬변수 b는 a+1이니까 1이 들어가게 된다. 결국 값이 복사가 되는 것. 2. Pass by Pointer 함수에서 매개변수로 포인터를 받게 되면, 이 포인터는 함수 바깥에 있는 변수에 접근 가능하다! 만약 예를 들어서, fooP() 에 *ap = 100 을 써주게 되면 어떻게 될까? fooP가 동작할 때 a 공간에 접근을 해서 값을 100으로 바꿔주는 코드가 된다. (접근 가능!) 3. Call by Reference 레퍼런스를 받는 fooR() 함수를 만들어주고 콜 해 주는 코드를 짜 보자. 사실 포인터로 넘겨주는 함수와 레퍼런스로 넘겨주는 함수 두 개는 똑같다. Compiler E..