>>[C++ 관련 모든 글 보기]
개요
L-value, R-value, &, && 관계와
R-value와 std::move에는 어떤 관계가 있는지 알아본다.
개념 설명
1. L-value와 R-Value 란?
- 자료형 선언 시 "=" 기준으로 왼쪽에 있는 것과 오른쪽에 있는 것을 가리킬 때 사용하는 명칭이다.
- 아래 그림에서 파란색 영역에 있는 것은 L-Value라고 칭하고 빨간색 영역에 있는 것을 R-Value라고 칭한다.
2. & 와 && 란?
- &은 reference라고 불리며, L-Value에 대한 새로운 별칭을 만들어 줄 때 사용된다.
- &&은 R-Value reference라고 불리며, R-Value에 대한 새로운 별칭을 만들어 줄 때 사용된다.
R-Value와 std::move의 관계
std::move는 L-Value를 R-value로 변경해주는 함수입니다.
이 말이 이해가 가야 std::move를 이해할 수 있습니다.
이걸 Pointer 개념으로 풀어본 다면 아래 와 같습니다.
아래 코드에서 좌측 코드에서 2, 3번줄이 우측 코드 3번줄과 동일한 역할을 합니다.
<Pointer로 구현> | <std::move로 구현>
1. std::string *str = new std::string("Test code"); | std::string str = "Test Code"
2. std::string *b = str; |
3. str = nullptr; | std::strig b = std::move(str);
유의 사항 :
std::move시에 숫자형 자료형에 대해서는 초기화가 이루어지지 않고 값 복사가 이루어집니다.
- pointer 일 경우 : move 대상 값이 nullptr로 초기화
- string 일 경우 : move 대상 값이 ""
- 숫자형 자료형 일 경우 : 값만 복사
std::move를 사용하면 왜 성능이 올라가는가?
메모리 관리 측면에서 보면,
std::move로 L-value에 값을 대입할 때 메모리 복사가 이루어지는 것이 아니라
단지 L-value가 std::move로 만든 R-Value를 참조하게 만들기 때문입니다.
즉, 메모리에 있는 데이터를 다른 곳으로 이동시키지 않고 데이터를 가리키고 있는 변수만 바꿔서 성능을 올리는 개념입니다.
'ProgrammingLang > c++' 카테고리의 다른 글
[C++] 언어의 철학 (0) | 2022.01.25 |
---|---|
[C++개발자되기]28. 파일 다루기 2부(확장자 검사) (0) | 2022.01.19 |
[C++개발자되기]24. std::function (0) | 2021.12.05 |
[C++개발자되기]23. 문자열 다루기 (0) | 2021.10.07 |
[C++개발자되기]22. golang의 defer 만들기 (0) | 2021.07.10 |