프로그래밍/C/C++

C++ Lvalue (좌측값) Rvalue (우측값) Rvalue reference (우측값 참조자)

nanze 2022. 1. 5. 21:51
반응형

c++ lvalue 와 rvalue

lvalue 와 rvalue 라는 무엇인가 ? 말그대로 좌측값과 우측값인데 c++ 에서 의미는 다음과 같이 생각하면 된다. 

lvalue 같은 경우에는 표현식 이후에도 사라지지 않고 지속되는 변수 또는 객체라고 생각하면 된다. 사라지지 않는다는 것은 그것을 지칭할 수 있는 무엇인가 있다는 것이고 그것은 "이름"이 될 것이다. 그러니 lvalue 는 이름을 가지고 있다. 따라서 모든 변수는 lvalue 라고 볼 수 있다. 

반대로 rvalue 같은 경우 표현식 이후에는 존재하지 않는 임시적인 무엇이다. 임식 객체 또는 상수 등은 rvalue 라고 볼 수 있을 것이다. 

다음 코드를 확인해 보자. 

#include <iostream>
#include <string>

int main()
{
    int a = 0;
    //변수 a는 lvalue    0 은 rvalue
    const int b = a;
    //변수 b는 lvalue
    int c = a + b;
    //변수 c는 lvalue   a+b 는 rvalue
    char* p = &c;
    //변수 p는 lvalue    &c 는 rvalue    
    wcout << std::wstring(L"rvalue") << endl;
    //std::wstring(L"rvalue") 는 rvalue
    ++a;
    //++a 는 lvalue   이유는 표현식이 증가한 a 를 반환
    a++;
    //a++ 은 rvalue   이유는 표현식이 증가한 복사값을 반환
    return 0;
}

코드에 주석으로 lvalue 와 rvalue 를 표기하였다. 앞서 말한 규칙과 같음을 알 수 있다. 이것이 참 표현하기 어려운데 예를들어 'a+b' 의 값 자체는 c 라는 변수를 통해 알 수 있다. 하지만 'a+b' 자체 표현에 대한 값은 대입 순간 말고는 존재하지 않는다. 내가 말하고도 무슨 말인지 모르겠다. 아무튼 표현식 또는 단일 표현식 이후 값이 사라지는지 아닌지가 rvalue 와 lvalue 의 구분 기준이라고 할 수 있다. 

 

rvalue reference (&&)

c++ 11 이후 우측값 참조자라는 기능이 추가되었다. 보통 우리가 알고 있는 int& x = y; 와 같은 표현식은 좌측값 참조자이다. 우측값 참조자는 우측값에 대한 참조 기능을 제공한다. 다음 코드가 바로 우측값 참조 표현의 경우이다.

#include <iostream>
#include <string>

int func()
{
    return 1;
}

int main()
{
    int lvalue = 10;
    
    int&& rvalue = func(); 
    //우측값 참조
    return 0;
}

 

우측값 참조는 왜 생겼을까 ? 우측값 참조가 가능함으로써 임시 값에 대한 복사 메카니즘 대신 참조가 가능하게 되어 성능이 많이 좋아졌다고 한다. 실제로 std::vector 의 경우에도 우측값 참조 기능 이전과 이후의 std::vector 복사 기능이 차이가 난다.  이것이 가능한 이유는 바로 move semantics 때문이다. move semantics 란 무엇일까?

move semantics

move semantics 는 객체의 리소스를 다른 객체로 이동하는 것을 의미한다. 우측값 참조 기능 이전에는 rvalue 라는 것은 해당  순간 말고는 어디에서도 참조될 수 없는 임식 객체 또는 값이기에 객체간 이동 시 복사 작업과 리소스 할당 등 부가적인 작업이 필요하였다. 하지만 우측값 참조 기능이 지원되면서 이 과정을 생략 가능하게 되어 성능 향상이 일어난 것이다. 

다음 정리 시간에는 이 move semantics 에 대해서 정리해보자. 

 

다음 정리글은

2022.01.06 - [프로그래밍/C/C++] - C++ rvalue reference (우측값 참조) move semantics

 

C++ rvalue reference (우측값 참조) move semantics

이전 정리글은 2022.01.05 - [프로그래밍/C/C++] - C++ Lvalue (좌측값) Rvalue (우측값) Rvalue reference (우측값 참조자) C++ Lvalue (좌측값) Rvalue (우측값) Rvalue reference (우측값 참조자) c++ lvalue..

nanze.tistory.com

 

반응형