: LValue를 RValue로 변환하고, 그와 동시에 자원의 소유권을 다른 오브젝트에 넘길 수 있다.
(+) copy가 발생하지 않는다.(lValue를 rValue로 변환하므로)
-> a의 소유권이 b에게 이전되었다.
: 매개변수로는 a의 주소값, value값 원본 그 자체가 s이며,
b에게 복사 대입없이 move 키워드를 통해 양도가 가능하다.
이때 a가 가리키는 값은 없어진다.
: 복사 대입이 2번 발생하는 것을 확인할수 있다.
-> RValue를 통해 복사 0번 일어나게 할 수 있다.
Rvalue로 바꿔서 진행하면 s가 LValue여서 문제가 생긴다.
LValue를 RValue로 변환해 사용하면 원본인 s의 소유권이 m_Name에게 넘겨진다.
s의 원본을 유지하기 위해서는 위에서 배운 것처럼 const를 붙이면 된다. 하지만 이때는 다른 문제가 있다.
: LValue를 넘겨주면 copy가 한번만 발생한다.
하지만 RValue를 넘겨주면 copy가 한번 발생한다.
RValue는 Call By RValue로 copy가 0번 발생하게 할 수 있는데,
지금 해당 함수에서는 copy가 한번 발생했다. -> 매개변수에서 복사 발생
-> 우리가 원하는 것은 lvalue 사용시에는 한번의 copy만, rvalue는 copy가 0번 일어나게 하는 것이다.
- call by value로 작성하면
LValue에서는 copy가 한번만 발생하고,
Rvalue에서는 copy가 0번 발생한다.
-> lValue에서는 매개변수 받을 때만 1번의 copy가 발생한다.
-> rValue에서 copy가 왜 0번 발생하는지 알아보자.
copy elision이 발생한다.(최적화 중의 하나)
컴파일러는 이미 넘어오는 인자가 Rvalue라는 것을 이미 알고 있어서,
(어차피 'zzokki'가 없어지는 것을 컴파일러가 알고 있어서 이러한
기능을 하는 것 같다.)
매개변수 in_name는 "zzokki"를 가리키고 있는 곳에 복사 대입이 아닌
그냥 문자열을 써준다.
함수내의 m_Name은 move키워드를 통해 소유권을 이전 받게 되면서,
복사 대입은 0번 발생한다.
#include <iostream>
#include <string>
using namespace std;
class Cat
{
private :
string m_Name;
public :
void SetName(string in_Name)
{
m_Name = move(in_Name);
}
};
void main()
{
Cat kitty;
string s = "bomi";
kitty.SetName(s);
kitty.SetName("zzokki");
}