오른값 참조 ? 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 |