Visual Studio 2010 공식 팀 블로그 @vsts2010

Posted by 흥배

C++0x의 새로운 기능인 우측 값 참조라는 것에 대해 설명하려고 합니다.

저는 처음에 이걸 대수롭지 않게 생각했는데..절대 그렇지 않더군요 -_-;;.

그냥 결과만 이해하면 어렵지는 않지만 그 과정까지 이해하려면 C++의 역사를 거슬러 올라가서 왜 이것이 생기게 되었는지, 참조와 우측 참조에 대한 이해가 필요하더군요. 그래서 생각 외로 시간이 많이 걸려서 글을 올리는 시간이 꽤 걸렸습니다.

 

짧게 설명하기는 힘든 것이라서 5회로 나누어서 글을 올리려고 합니다.

이번 회는 금방 이해가 되지 않을 수도 있지만 이론 적인 부분을 설명하고(재미없는 -_-;), 다음 회에는 실제 코드로 예제를 보여드리면서 설명합니다.

제 글 실력이 좋지 않아서 이번 글로 이해하기 힘들 수 있겠지만 귀찮더라도 쭉 정독을 하고 다음 회의 예제를 보면서 RValue Reference에 대하여 알수 있기를 바랍니다.

 

 

 

참조

C++에는 참조라는 라는 것이 있습니다. 사용 방법은 ‘&’을 사용합니다.

Int a = 10;

Int& refA = a;

refA는 변수 A를 참조합니다. 이후 refA의 값을 변경하면 refA가 참조하고 있는 변수 A의 값이 변경됩니다. refA는 변수 A를 가리키고 있는 것입니다.

기존에 ‘&을 사용한 참조는 ‘LValue Reference’라고 부릅니다.

 

 

 

RValue Reference

 

C++0x에는 새롭게 RValue Reference라는 것이 생겼습니다.

RValue Reference의 의해 임시 오브젝트를 만들어서 복사하지 않고 포인터의 이동에 의해 프로그램의 성능이 빨라지고 낭비가 없어집니다(중요!!!).

 

사용 방법은 기존의 참조와 비슷해서 참조가 ‘&’을 사용했듯이 ‘&&’를 사용합니다.

int&& RrefA = a;

 

RValue Reference LValue Reference와 구문이나 의미적으로 비슷하지만 몇 개의 다른 룰을 따르고 있습니다. 가장 크게 눈에 띄는 차이는 함수를 오버로드 할 때입니다.

 

RValue Reference는 임시 오브젝트의 값을 변경하는 함수를 만들 때나 RValue Reference LValue Reference를 동일하게 취급하고 싶을 때 사용하면 편리합니다.

 

 

 

Move semanticsPerfect forwarding


RValue Reference에는 Move semanticsPerfect forwarding이라는 중요한 두 개의 개념이 있습니다.

 

Move semantics에 의해서 애플리케이션의 성능을 비약적으로 향상 시킬 수 있습니다.

‘&&’을 사용하여 move 생성자나 move 대입연산자를 정의하면 어떤 오브젝트에서 다른 오브젝트로 리소스를 이동 시킬 수 있습니다. 즉 오브젝트를 메모리상에서 다른 장소의 메모리로 이동 시키고 싶을 때 사용합니다.

 

현재의 STL vector는 새로운 요소를 삽입할 때 빈 영역이 없으면 새로운 메모리를 확보한(보통 현재 할당된 메모리의 2) 후 기존 요소를 복사한 후 새로운 요소를 삽입합니다. 그러나 Move semantics에 의해 성능에 부하가 큰 복사가 아닌 메모리 상에서 이동을 시킵니다.


C++0x의 모든 STL에는 Move semantics가 적용됩니다. 그래서 기존의 코드를 바꾸지 않고 C++0x를 사용하는 컴파일러만 사용해도 성능 향상이 이루어집니다.

 

Perfect forwardingforwarding 문제에 때문에 함수를 오버로드 해야 되는 것을 줄여줍니다. Forwarding 문제는 템플릿 함수의 파라메터가 참조를 포함하고 있고 이 함수의 내부에서 호출하는 함수에 인자로 넘길 때 발생할 수가 있습니다. 템플릿 함수가 const T&라는 파라메터를 가지고 있다면 이 함수는 우측 값인 임시 오브젝트나 정수형 상수 등을 넘겨 받을 수 없습니다.

 

이 문제를 해결하기 위해서는 템플릿 파라메터가 T& const T&을 가지는 오버로드 함수를 만들어야 합니다. 이렇게 되면 파라메터의 수에 따라서 함수 오버로드가 지수적으로 증가합니다.

RValue Reference를 사용하면 이런 문제를 해결할 수 있습니다.

 

 

 

그럼 다음에는 위에서 알쏭달쏭하게 한 이야기를 코드를 중심으로 설명하겠습니다.

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 설명하기 쉽지 않은 개념인데 수고하셨습니다. ^^ lvalue, rvalue의 정확한 정의는 http://en.wikipedia.org/wiki/Lvalue 여기를 참조하셔도 좋을듯.

  2. 오타가 있으신듯 하네요.
    STL vector는 새로운 요소를 삽입할 때 잡는 크기는 1.5배입니다.

    많이 배우고 가겠습니다.