본문 바로가기
c++/모던c++

오른값 참조 &&

by kcj3054 2022. 3. 29.

오른값 참조 ? move?

  • 우선 오른값이 머냐?.. 왼값과 비교해보자

  • 왼값 : 단일식을 넘어서 식이 유지되는 것! int sum = 20; 여기서 sum변수는 다른 곳에서도 사용 가능하다 (스택영역이라면 해당 범위내에서만..)

  • 오른값 : 왼값이 아닌 것은 오른값이다 (람다, 열겨형, i++, 임시값, 생성자..)

왼값 오른값참조 함수 버전

class Knight
{
public:
    void Print() {}
public:
    int _hp = 1200;
};

void TestKnight_Copy(Knight knight) { }

void TestKnight_LValueRef(Knight& knight) { }

void TestKnight_ConstLValueRef(const Knight& knight) {}

void TestKnight_RValueRef(Knight&& knight) {} 
  • void TestKnight_Copy(Knight knight) { }는 복사방식이다. 단점은? -> 복사가 되면 새로운 객체가 생성되는 것이라서 메모리 낭비가 된다. 느리다..

  • TestKnight_LValueRef는 왼값 참조이다, 원본을 고칠 수 있다.

  • TestKnight_ConstLValueRef는 왼값이지만 const로 해서 읽기만 가능하도록했다..

  • TestKnight_RValueRef 오른값 참조버전이다. 읽고, 쓰고 가능하며 이동대상이된다.

  • 이동? 이동이 먼가 std::move()의 원래이름의 후보가 rvalue_cast라고한다 오른값을 넘긴다고 생각하면된다.

std::move() 왜 필요한가?

  • 복사를 안해서 이동 시켜줘서 성능이 좋아서 move를 쓰나? 그런 것도 있다.

  • 그렇지만 스마트 포인터 중에서 unique_ptr을 살펴보자! f12를 타고 가면 unique_ptr는 = delete로 값 복사하는 부분이 막혀 있는 것을 알 수 있다.. 자세한 것은 템플릿 고급쪽을 더 공부해좌..

  • 그래서 복사가 막혀있는데 해당 값을 전달해줘야할 경우 move를 통해서는 가능하다.

  • 참고 unique_ptr은 세상에 하나 밖에 참조하지 않는 포인터이다..

    unique_ptr move 버전

 std::unique_ptr<Knight> uptr = std::make_unique<Knight>();
 std::unique_ptr<Knight> uptr2 = std::move(uptr); 
  • 루키스님의 c++수업을 바탕으로 학습 후 작성하였습니다.

'c++ > 모던c++' 카테고리의 다른 글

c++20(concept)  (0) 2022.05.23
varidic template (가변인자.. tuple직접구현..)  (0) 2022.05.22
c++ 11 가변인자템플릿 varidic template  (0) 2022.04.07
전달 참조 forwarding reference (c++17)  (0) 2022.03.29
모던c++ delete  (0) 2022.03.29