ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    댓글

Designed by Tistory.