C++11에서 새로 추가된 내용은 RValue Reference입니다.
RValue Reference의 특징과 더불어 Move Sematics와 Perfect Forwarding에 대해서 알아보겠습니다.
RValue는 간단해 보이는 구문이기는 하지만 실제로는 이해하기가 상당히 복잡한 편입니다.
1. RValue와 LValue
C++의 모든 표현식은 RValue나 LValue로 구분이 가능합니다.
보통 LValue를 대입 연산자의 좌측에 있는 값, RValue를 우측에 있는 값으로 표현하는데
C++에서는 그런 방법으로 구분하지 않습니다.
식이 표현이 지속성을 가질 때 LValue라고 하며 범위(Scope) 내의 다른 부분에서 다시 사용이 가능한 값입니다.
그에 반해 RValue는 이런 지속성을 가지지 않는 임시적인 값들을 의미합니다.
흔히 3 + 4나 임시로 생성되는 객체들을 의미합니다.
이런 값들은 실제로 한 번 사용된 이후로는 다시 참조가 불가능합니다.
클래스 A를 생성하는 코드로 A(); 만 적으면 생성은 되지만 다른 곳에서 다시 참조가 안되기 때문에 RValue가 됩니다.
이런 임시적인 RValue를 참조하게 해주는 것이 RValue Reference입니다.
2. RValue Reference
RValue Reference를 설명하기 전에 C++의 LValue Reference에 대해서 알아보겠습니다.
흔히 변수에 별명(Alias)를 지정하는 것이라고 합니다.
LValue Reference가 되면 해당 값을 변경하게 되면 원래의 값이 함께 변경이 됩니다.
LValue Reference는 &연산자를 사용합니다.
&는 C/C++에서 주소를 나타내기도 하는데 &이 타입(char&, int&, long& 등등)에 붙으면 LValue Reference가 됩니다.
주소 지정 연산자(Address-of)와 혼동하면 안됩니다.
다음 예제를 보겠습니다.
#include <iostream> #include <string> using namespace std; struct Person { string Name; short Age; }; void main() { // Declare a Person object Person myFriend; // Declare a reference to the Person object Person& rFriend = myFriend; // Set the fields of the Person object // Updating either variable changes the same object myFriend.Name = "Bill"; rFriend.Age = 40; // Print the fields of the Person object to the console cout << rFriend.Name << " is " << myFriend.Age << "years old." << endl; }
결과는 "Bill is 40years old." 가 출력이 됩니다.
myFriend의 LValue Reference로 rFriend를 선언해주고 번갈아가면서 값을 대입하고 출력했습니다.
그래도 정상적으로 출력이 되는 것을 알 수 있습니다.
RValue Reference의 연산자는 &&를 사용합니다.
void main() { int nVal = 10; // int& nLVal = 10; int& nLVal = nVal; // int&& nRVal = nVal; int&& nRVal = 10; }
RValue Reference와 LValue Reference의 예입니다.
LValue Reference는 지속성이 있는 변수 등을 참조 가능하고 RValue Reference는 임시 값 등을 참조 가능합니다.
주석으로 처리된 반대로 된 부분은 에러를 발생하게 됩니다.
RValue Reference는 불필요한 복사를 제거해서 성능 향상에 도움을 주는 새로운 개념입니다.
RValue Reference가 가진 중요한 특징인 Move Sematics와 Perfect Forwarding에 대해서 다음 글에서 정리하겠습니다.
이 특징들을 알게 되면 왜 RValue Reference가 필요하게 된 것인가 알 수 있습니다.
'Programming > CPP11&14' 카테고리의 다른 글
[C++11] RValue Reference(3) (0) | 2014.12.18 |
---|---|
[C++11] RValue Reference(2) (0) | 2014.12.17 |
[C++11] 이름 없는 함수, 람다(Lambda)(2) (2) | 2014.12.11 |
[C++11] 이름 없는 함수, 람다(Lambda)(1) (0) | 2014.12.11 |
[C++11] Range-Based For Loop (0) | 2014.12.11 |