728x90
반응형

Modern C++에서 unique_ptr 반환 시 암시적 이동(Implicit Move)과 RVO(Return Value Optimization) 이해

  • Modern C++에서 함수 내 지역 변수로 생성된 unique_ptr 객체를 반환할 때 std::move()를 명시적으로 호출해야 할지 고민하는 경우가 많습니다.
  • 그러나 C++ 표준에서는 이를 자동으로 처리하는 메커니즘이 존재합니다.
  • 이번 글에서는 unique_ptr 반환 시 자동으로 적용되는 암시적 이동(Implicit Move) 과 이와 관련된 개념인 RVO(Return Value Optimization) 를 함께 정리합니다.


1. 암시적 이동 (Implicit Move)

  • C++11 이후 표준에서는 다음 조건이 충족될 때, return 문에서 지역 변수를 반환할 경우 자동으로 이동 연산 을 수행합니다.
    • 반환하려는 객체가 이름을 가진 지역 변수일 것
    • 해당 타입이 복사 불가능(delete된 copy constructor)이며 이동 가능할 것
    • return var; 형식으로 반환될 것

  • 이때 컴파일러는 return var; 구문을 내부적으로 return std::move(var);로 처리합니다.
    • 이를 Implicit Move (암시적 이동) 라고 부릅니다.


2. 표준 근거

ISO C++ 표준 (C++11 12.8/32, C++14 12.8/31, C++17 15.8.3)
"When certain conditions are met, the compiler is permitted to treat a return of a local object as an implicit move."

  • 즉, 표준에서 보장하는 언어 기능이며, 개발자가 별도로 std::move()를 호출하지 않아도 됩니다.


3. RVO(Return Value Optimization)와의 차이

  • 구분 암시적 이동 (Implicit Move) RVO (Return Value Optimization)
    정체 언어 기능 컴파일러 최적화
    조건 이동 생성자가 존재하며 지역 변수를 반환할 때 자동 적용 객체 복사 또는 이동 자체를 생략하는 최적화
    효과 복사 대신 이동이 수행됨 복사/이동 자체 없이 객체가 반환 지점에 직접 생성됨
    결과 return var; 구문이 return std::move(var);처럼 동작 객체를 따로 생성하지 않고 바로 반환 메모리에 생성


4. 예제

  • cpp

      #include <iostream>
      #include <memory>
      
      using namespace std;
      
      class Simple
      {
      public:
      	Simple() { cout << "Simple constructor called!" << endl; }
      	~Simple() { cout << "Simple destructor called!" << endl; }
      };
      
      unique_ptr<Simple> create()
      {
      	auto ptr = make_unique<Simple>();  // Simple 객체 생성
      	
      	return ptr;  // std::move(ptr) 호출 없이도 암시적 이동 발생
      }
      
      int main()
      {
      	auto smartPtr1 = create();
      	auto smartPtr2 = create();
      	return 0;  // 소멸자 두 번 호출
      }
    


5. 정리

  • unique_ptrreturn 할 때 std::move()필요하지 않습니다.

  • C++ 표준의 암시적 이동(Implicit Move) 기능이 자동으로 적용됩니다.

  • 컴파일러는 경우에 따라 RVO 를 적용하여 복사/이동조차 생략하기도 합니다.

  • 필요하면 std::move()를 써도 문제는 없지만, 가독성을 위해 생략하는 것이 일반적 입니다.




  • 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄

728x90
반응형

+ Recent posts