move 키워드에 대해

보물창고·2021년 7월 26일
0
  • 코드 없는 프로그래밍 강의를 공부하고 정리한 내용입니다.
    (+) rvalue, lvalue는 블로그 참고

move 키워드란?

: LValue를 RValue로 변환하고, 그와 동시에 자원의 소유권을 다른 오브젝트에 넘길 수 있다.
(+) copy가 발생하지 않는다.(lValue를 rValue로 변환하므로)

-> a의 소유권이 b에게 이전되었다.

LValue vs RValue

LValue

1) 레퍼런스 사용 - 복사 대입

: 매개변수로는 a의 주소값, value값 원본 그 자체가 s이며,

  • 함수 내에서는 b에게 복사 대입이 발생한다.

2) move 키워드 사용

b에게 복사 대입없이 move 키워드를 통해 양도가 가능하다.
이때 a가 가리키는 값은 없어진다.

  • 소유권을 잃는다.

3) const를 매개변수에 사용하면? - move를 하더라도

  • const로 인해 복사가 발생한다.
  • 차이는 s값 변경이 불가능하다는 거
  • 원본의 소유권을 잃지 않는다.

4) class 를 이용한 예제


: 복사 대입이 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번 일어나게 하는 것이다.

copy Elision // 복사 생략

- 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");
}
profile
🔥🔥🔥

0개의 댓글