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/C++' 카테고리의 다른 글
C++ rvalue reference 우측값 참조 속성 (0) | 2022.01.07 |
---|---|
C++ rvalue reference (우측값 참조) move semantics (0) | 2022.01.06 |
C++ lambda expression 람다 표현식 (0) | 2022.01.04 |
c++ 템플릿 가변인자 Variadic template (0) | 2021.12.29 |
소멸자 명시적 호출의 주의점 ? (0) | 2021.12.24 |