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의 의해 임시 오브젝트를 만들어서 복사하지 않고 포인터의 이동에 의해 프로그램의 성능이 빨라지고 낭비가 없어집니다(중요!!!).
사용 방법은 기존의 참조와 비슷해서 참조가 ‘&’을 사용했듯이 ‘&&’를 사용합니다.
RValue Reference는 LValue Reference와 구문이나 의미적으로 비슷하지만 몇 개의 다른 룰을 따르고 있습니다. 가장 크게 눈에 띄는 차이는 함수를 오버로드 할 때입니다.
RValue Reference는 임시 오브젝트의 값을 변경하는 함수를 만들 때나 RValue Reference나 LValue Reference를 동일하게 취급하고 싶을 때 사용하면 편리합니다.
Move semantics와 Perfect forwarding
RValue Reference에는 Move semantics와 Perfect forwarding이라는 중요한
두 개의 개념이 있습니다.
Move semantics에 의해서 애플리케이션의
성능을 비약적으로 향상 시킬 수 있습니다.
‘&&’을 사용하여 move 생성자나 move 대입연산자를 정의하면 어떤 오브젝트에서 다른 오브젝트로 리소스를 이동 시킬 수 있습니다. 즉 오브젝트를 메모리상에서 다른 장소의 메모리로 이동 시키고 싶을 때 사용합니다.
현재의 STL vector는 새로운 요소를 삽입할 때 빈 영역이 없으면 새로운 메모리를 확보한(보통 현재 할당된 메모리의 2배) 후 기존 요소를 복사한 후 새로운 요소를 삽입합니다. 그러나 Move semantics에 의해 성능에 부하가 큰 복사가 아닌 메모리 상에서 이동을 시킵니다.
C++0x의 모든 STL에는 Move semantics가 적용됩니다. 그래서 기존의 코드를 바꾸지 않고 C++0x를 사용하는 컴파일러만 사용해도 성능 향상이 이루어집니다.
Perfect forwarding는 forwarding 문제에 때문에 함수를 오버로드 해야 되는 것을 줄여줍니다. Forwarding 문제는 템플릿
함수의 파라메터가 참조를 포함하고 있고 이 함수의 내부에서 호출하는 함수에 인자로 넘길 때 발생할 수가 있습니다. 템플릿 함수가 const T&라는 파라메터를 가지고 있다면
이 함수는 우측 값인 임시 오브젝트나 정수형 상수 등을 넘겨 받을 수 없습니다.
이 문제를 해결하기 위해서는 템플릿 파라메터가 T&와 const T&을 가지는 오버로드 함수를 만들어야 합니다. 이렇게
되면 파라메터의 수에 따라서 함수 오버로드가 지수적으로 증가합니다.
RValue Reference를 사용하면 이런 문제를 해결할 수 있습니다.
그럼 다음에는 위에서 알쏭달쏭하게 한
이야기를 코드를 중심으로 설명하겠습니다.
'C++0x' 카테고리의 다른 글
| [VC++] 6. 우측 값 참조( RValue Reference ) - 세 번째 (0) | 2009/05/09 |
|---|---|
| [VC++] 5. 우측 값 참조( RValue Reference ) – 두 번째 (2) | 2009/05/06 |
| [VC++] 4. 우측 값 참조( RValue Reference ) - 첫 번째 (2) | 2009/05/04 |
| [VC++] 3. static_assert (0) | 2009/04/27 |
| [VC++] 2. C++0x의 auto (6) | 2009/04/23 |
| [VC++] 1. 큰 변화가 기대되는 Visual C++( VC++ ) (4) | 2009/04/21 |




댓글을 달아 주세요
설명하기 쉽지 않은 개념인데 수고하셨습니다. ^^ lvalue, rvalue의 정확한 정의는 http://en.wikipedia.org/wiki/Lvalue 여기를 참조하셔도 좋을듯.
오타가 있으신듯 하네요.
STL vector는 새로운 요소를 삽입할 때 잡는 크기는 1.5배입니다.
많이 배우고 가겠습니다.