-
[Rvalue reference] Move Semantics(2)개발/C·C++ 2021. 5. 12. 11:31
>> 번역글입니다
>> 의역은 있고 오역이 있을 수 있습니다
>> 출처 thbecker.net/articles/rvalue_references/section_02.html
X가 어떤 리소스에 대한 포인터나 핸들을 갖고 있는 클래스라고 가정하겠습니다. m_pResource라고 합시다. 리소스로 인해서, 객체를 생성하고 복사하고 파괴하는 데에 적지 않은 노력이 듭니다. 동적 할당된 배열에 객체들을 갖고 있는
std::vector
가 좋은 예가 될 것 같습니다. 클래스 X의 복사 할당 연산자는 다음과 같을 것입니다.X& X::operator=(X const & rhs) { // [...] // Make a clone of what rhs.m_pResource refers to. // Destruct the resource that m_pResource refers to. // Attach the clone to m_pResource. // [...] }
복사 생성자도 비슷하게 추론해볼 수 있습니다. X가 다음과 같이 쓰인다고 가정해볼게요.
X foo(); X x; // perhaps use x in various ways x = foo();
마지막 줄의 의미는
- `foo`가 리턴한 임시 객체를 복사한다 - x가 갖고 있던 리소스를 파괴하고 복사한 걸로 대체한다 - 임시 객체를 파괴하면서 리소스를 해제한다
확실하게 말할 수 있는 건,
x
와 임시 객체 간에 포인터(핸들)을swap
하고 임시 객체의 소멸자가 기존x
의 리소스를 파괴하는 것이 더 효율적라는 사실입니다. 다르게 표현해보면, 할당 연산의 오른쪽이rvalue
인 경우에 복사 할당 연산자가 다음처럼 동작하기를 원합니다.// [...] // swap m_pResource and rhs.m_pResource // [...]
이를 move semantics(이동 의미론)이라고 합니다. C++11부터 이 조건부 동작이 오버로드를 통해 가능해졌습니다.
X& X::operator=(<mystery type> rhs) { // [...] // swap this->m_pResource and rhs.m_pResource // [...] }
우리는 복사 할당 연산자의 오버로드를 정의할 예정이기 때문에 mystery type은 반드시 reference여야 합니다. 오른쪽 값이 레퍼런스로 전달되어야 하며, mystery type에 대해 다음과 같은 동작을 원합니다: 기존 reference와 mystery type을 받는 오버로드 함수가 둘 있을 때, rvalue는 mystery type을 선택해야 합니다. lvalue는 기존 reference를 선택하구요.
'개발 > C·C++' 카테고리의 다른 글
IOCP(1) (0) 2021.05.25 [Rvalue reference] Rvalue Reference(3) (0) 2021.05.21 [Rvalue reference] Introduction(1) (0) 2021.05.12 번역 예정 아티클 / 정리할 개념 (0) 2021.05.07 [template] 템플릿 특수화 (0) 2021.05.01