반응형

C언어, C++11이전까지의 L-value, R-value

 

L-value : locator value, 저장 장소 위치의 값, 할당 연산자 기준으로 왼쪽에 오는 값

R-value : value of an expression, 수식의 값, 할당 연산자 기준으로 오른쪽에 오는 값

 

 

 

C++11 이후

출처: https://docs.microsoft.com/ko-kr/cpp/cpp/lvalues-and-rvalues-visual-cpp?view=vs-2019

glvalue, xvalue, prvalue 개념이 새로 생겼다 일단 

 

 

L-value와 R-value 부터 정리하면

 

 

위 코드에서 left_value, right_value, result 는 모두 L-value 로서 식별자(변수이름)를 가지고 다른 데이터를 복사해서 자신의 상태(값)를 변경 할 수 있다.

3, 7, 0 은 모두 R-value 이다.

R-value는 다른 데이터의 메모리를 복사할 공간이 없거나, 식별자가 따로 존재하지 않기 때문에 대입이 불가능하다.

또한 3,7,0 은 식별자가 따로 존재 하지 않기 때문에, 따로 변수처럼 접근 할 수 없어, 일시적인 값, 사라지는 값이라고 할 수 있다

 

 

L-value는 Locator value, 존재하는 메모리를 식별할 수 있는지의 여부, 즉 식별자가 있어야 하고, 식별자를 가지고 다른 값을 복사 받을 수 있으면 L-value 라고 할 수 있다.

그러나 배열타입, 불완전한타입, const 타입은 Lvalue 로 올 수 없다

 

R-value는 value of an expression, 즉 수식을 계산한 후의 값이다, 위에서 left_value + right_value 는

수식 (left_value의 값) + (right_value의 값)의 결과 값 10 이 되고

10( left_value + right_value 의 결과 값 )은 식별자가 존재 하지 않기 때문에 R-value인 것이다 

 

 

 

이제  glvalue, xvalue, prvalue 를 파헤쳐 보면

크게 식별자의 유무에 따라서 나눌 수 있고

식별자 있음 : glvalue( xvalue, lvalue)

식별자 없음 : prvalue

 

move의 가능 여부 에 따라서 나눌 수 있다

move 가능 : rvalue(xvalue, prvalue)

move 불가능 : lvalue

 

여기서 move의 가능이란, move semantics 가 가능하다 또는 값이 메모리에서 이동 될 수 있는것을 말한다.

 

 

위 MSDN 정리 그림을 https://docs.microsoft.com/ko-kr/cpp/cpp/lvalues-and-rvalues-visual-cpp?view=vs-2019

다시 표시하면

이렇게 볼 수 있다

 

 

lvalue : identity 가짐, move 없는 표현식들

 

 

xvalue : identity 가짐, move 있는 표현식들

 

 

prvalue : identity 안가짐, move 있는 표현식들

 

 

glvalue : identity 가지고 있는 표현식들(lvalue, xvalue)

 

 

rvalue : move 있는 표현식들(prvalue,xvalue)

반응형

+ Recent posts