본문 바로가기

Programming/CPP11&14

[C++11] RValue Reference(1)

반응형

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가 필요하게 된 것인가 알 수 있습니다.

반응형