[C/C++] L-Value, R-Value

그림자왕국·2020년 9월 19일
1

C++

목록 보기
17/24
post-thumbnail

L-Value (좌측값)

L-Value는 한 번 이상 쓰여지는 변수나 포인터로 정의된 구체화된 값을 의미한다.
모든 변수나 포인터 식별자는 L-value 다.

int & a = b; // a와 b 모두 l-value이다.

R-Value (우측값)

R-Value는 L-Value 와는 다르게 한 번이상 사용할 수 없는, 곧 사라지는 개체를 의미한다.
이에 해당되는 값들은 주로 임시값이나 문자열, 중간값 등이 해당된다. R-value는 힙 영역에 위치한다.

int a = 70;
string s = "temp";
int c = a+b; // a+b를 계산하고 난 직후의 계산값을 R-value라 한다.

위 코드에서 좌측에 있는 변수들은 모두 L-Value 이고, 나머지 우측값들은 R-Value 다.

R-Value Reference

R-Value reference는 R-Value 값을 참조할 수 있는 L-Value 참조자이다.
참조된 R-Value는 소멸되지 않고, 참조자의 특성에 따라 추가적인 복사도 일어나지 않는다.
※ 참조자가 L-value 인 이유는 식별자가 붙음으로써 한 번 이상 쓰여질 수 있기 때문이다.

int && ra = 70; // 70은 이제 R-value 레퍼런스 ra(L-value)에 의해 관리된다.
int && rb = ra; // error! R-value 레퍼런스에 L-value(ra)값을 바인딩 할 수 없다.

std::move()

std::move(value)를 통해 value 인수를 R-value값으로 변환하여 반환한다.
move()를 하게 되면 value는 nullptr가 될 테니 데이터를 이동한다고 보면 된다.
반환 값은 R-value가 되니 보통 L-Value 참조자(&)는 받을 수 없다.

string & ref = std::move(s); // error! R-value를 반환하여 레퍼런스를 참조할 수 없다.
const string & ref = std::move(s); // const 참조자는 R-value를 변경할 수 없으니 허용됨
string && s = "abcd";
string b = std::move(s); 
string b = s; // wrong! "s is L-value!"

마지막 줄 b에 s값을 R-value가 아닌 L-value 상태로 복사한다면 스택 프레임에 추가적인 할당과 오버헤드가 일어난다. 따라서 low-overhead를 유지하기 위해 s를 R-value로 바꿔준다.

string b = std::move(s); // 이제 copy가 한 번도 일어나지 않는다.
profile
언리얼 엔진 매니아입니다.

0개의 댓글