본문 바로가기
Development/C & C++

C++0x - rvalue reference <- 위키백과 내용을 번역.

by nickeys 2011. 7. 9.
임시값(보통 rvalue라고 불리는 수식의 우측에 오는 값)는 절대 변경이 불가능한 것이었다(C에서 처럼, 그리고 const T& 타입과 분간할 수 없는 것처럼 여겨졌다). 그러나, 임시 값은 몇몇 상황에서는 변경이 가능했고,
심지어 유용한 허점처럼 여겨졌다(Alexandrescu "C++ coding standards" #15를 참고하라).
C++0x는 rvalue 참조라 불리며 T&&로 식별되는 새로운 비-상수형 참조 타입을 추가했다. 이 것은 초기화 된 이후에 변경이 가능한 임시값들을 참조 하며, 이는 move문을 사용하기 위한 것이다.

이전 표준에서의 만성적인 성능 문제는, 객체가 값에 의한 전달이 될 때 생기는 암시적으로 발생하는 비용상 불필요한 깊은 복사 때문이었다. 이 문제에 대해 설명하기 위해, std::vector<T>를 고려해보자.
만약 std::vector<T> 임시변수가 만들어지거나 함수에서 반환된다면, 새로운 std::vector<T>를 만들고 rvalue의 모든 데이터를 복사 함으로써 값 복사가 완료될 수 있다. 그 때, 해당 임시 변수와 그 것의 모든 메모리는 파괴된다
(간단하게, 이 논의는 리턴값 최적화를 무시한 것이다).

C++0x에서, 하나의 std::vector<T>에 대한 rvalue참조를 취하는std:vector<T>의 "move 생성자"는 간단히 rvalue로 부터 (내부적으로)C-스타일의 배열에 대한 포인터를 새로운 std::vector<T>에 복사한다. 그 때, rvalue 내부의
포인터를 널(null)로 설정한다. 왜냐하면 해당 임시변수의 포인터가 지워질 수 있고, 이 메모리는 스코프를 벗어날 때 삭제되지 않는다. 그래서 깊은 복사는 요구되지 않는다. 게다가, 해당 임시변수가 다시 사용될 일이 없으므로
안전하며 비가시적 연산이다.

rvalue 참조는 표준 라이브러리 밖에서 어떤 변화도 요구하지 않고, 기존 코드에 대한 성능 향상을 가져다 줄 수 있다. 임시변수들은 자동으로 rvalue로 간주되기 때문에 std::vector<T>임시 변수를 반환하는 함수의 반환되는
값의 타입은 move생성자를 실행하기 위해 명시적으로 std::vector<T>&& 로 명시적으로 변경될 필요가 없다(하지만, 만약 std:vector<T>가 move생성자가 없는 C++03버전일 경우, 'const std::vector<T>&'를 인자로 받는 복사 생성자가
호출되서 많은 메모리 할당이 일어날 것이다).


안전상의 이유로, 몇 가지 제약사항이 주어진다. 이름이 있는 변수(a named variable)는 다음과 같이 선언 된다 하더라도 rvalue로 간주되지 않는다; rvalue를 얻기 위한 함수 템플릿 std:move<T>()가 사용될 것이다. rvalue 참조는
주로 move생성자와 함께 사용되는 것과 같은 몇몇 상황들 에서만 수정 가능하다.

rvalue참조의 문법 특성과 lvalue 참조에 대한 몇 가지 수정사항(regular reference) 때문에, rvalue 참조는 개발자들이 완벽한 함수 전달을 제공하게끔 한다. 가변인자 템플릿(variadic template)과 조합 되었을 때, 이 기능은
인자들을 그 특정 인자를 받는 다른 함수로 전달하는함수 템플릿을 완벽하게 지원한다. 이 것은 자동으로 이러한 주어진 인자에 적합한 생성자를 호출할 팩토리 함수를 생성하기 위해, 생성자의 인자를 전달하는데 몹시 유용하다.

'Development > C &amp; C++' 카테고리의 다른 글

DLL  (0) 2011.05.09
Memory in Windows system  (0) 2011.05.09