본문 바로가기
TIL (Today I Learn)

L-Value & R-Value

by Daily Ideas 2023. 9. 13.
반응형

 

어떻게 보면 C++로 작업하다 보면 자연스럽게 알게 되는 부분이지만, 

의사소통을 할 때 필요한 경우가 있겠다 싶어 (+ 개념을 좀 정리해 보는 시간을 가지고 싶어서)
정말 간단하게 정리해 보려고 한다.

이것저것 다 설명하려면 문서가 길어지니.. 먼저 요약하면, 

L-Value(&) = 식의 왼쪽에 들어올 수 있는 값.

R-Value(&&) = 식의 오른쪽에만 들어갈 수 있는 값.

조금 더 기본 개념에 가깝게 요약하면 : 

L-Value = 메모리 상에서의 위치가 특정되는 값.

R-Value = 메모리 상에서의 위치가 특정되지 않는 값. 

 

값이 L-Value 와 R-Value 로 나누어진 이유

- 깊은 복사와 얕은 복사를 이해할 필요가 있다.

깊은 복사 : 새로운 메모리 공간에 제시된 데이터를 전부 복사해서 같은 형태의 메모리가 2개가 됨.

얕은 복사 : 실제로는 주소 값만 복사하여 이전 값과 해당 값을 연결.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

얕은 복사 사용 예제 : 

결과물 :  보면 알 수 있듯 세 Identifier 는 모두 같은 메모리를 가리키고 있다고 볼 수 있다. 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이걸 왜 쓰는가 ? :

나중에 설명하겠지만 대개의 경우 보통 MoveSementics 를 위해 사용한다. 

위 예시의 경우 int 지만 대개의 경우 이러한 복사는 Object 에서 일어나기 때문에,
깊은 복사를 할 경우 메모리 추가 할당 + 복사라는 과정을 거치게 되므로, 완전히 별개의 오브젝트를 얻게 되는 반면
연산에 불리한 점이 있다.

따라서 이러한 과정이 필요 없을 경우 이미 존재하는 결과물에 이름만 새로 붙여서 사용하는 식이다. 우리가 일반적으로 생각하는 l-value 간의 참조랑 개념이 비슷하다(위 예시에 보여줌).
차이점은  한번 사용하고 버려지는 r-value 에 대해서 깊은 복사를 이용해 데이터를 새로 만들어 사용할 필요 없이, 
r-value 에 그대로 이름을 붙여서 사용한다는 점이다.

예를들어 복사 생성자의 경우에 생성 과정에서 Deep Copy가 발생하지만,
이동 생성자를 사용하게 되면 Swallow Copy의 형식을 쓰기 때문에 성능 상 훨씬 우위에 서게 된다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

관련 함수 정리 추가 : 

Std::Froward

-> 템플릿에서 인자로 들어온 l-Value / R-Value 의 타입에 따라 다른 동작을 하도록 하는 std 함수

https://learn.microsoft.com/ko-kr/cpp/standard-library/utility-functions?view=msvc-170#forward

 

<utility> 함수

자세한 정보: 함수

learn.microsoft.com

Std::Move

-> l-Value 라고 하더라고 R-value 로 타입 캐스팅 해주는 함수. 

https://learn.microsoft.com/ko-kr/cpp/standard-library/utility-functions?view=msvc-170#move

 

<utility> 함수

자세한 정보: 함수

learn.microsoft.com

 

 

참고하면 좋은 링크 : https://velog.io/@15ywt/c-rvalue-reference

 

c++ rvalue reference

Rvalue Reference? Rvalue Reference는 c++ 11에서 성능 개선을 위해 추가된 문법이다. 형태는 다음과 같다. 이 문장은 rvalue인 3을 a라는 lvalue로 참조한다는 뜻이다. 이를 확실히 이해하기 위해서는 rvalue,lvalu

velog.io

 

반응형

댓글