ProgrammingLang/c++

[C++개발자되기]26. L-value, R-value, &, && 와 std::move의 관계

jinkwon.kim 2021. 12. 5. 19:09
728x90
반응형

>>[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를 참조하게 만들기 때문입니다.

 

즉, 메모리에 있는 데이터를 다른 곳으로 이동시키지 않고 데이터를 가리키고 있는 변수만 바꿔서 성능을 올리는 개념입니다.

728x90
반응형