728x90
반응형
Modern C++
에서 함수 내 지역 변수로 생성된unique_ptr
객체를 반환할 때std::move()
를 명시적으로 호출해야 할지 고민하는 경우가 많습니다.- 그러나
C++
표준에서는 이를 자동으로 처리하는 메커니즘이 존재합니다. - 이번 글에서는
unique_ptr
반환 시 자동으로 적용되는 암시적 이동(Implicit Move
) 과 이와 관련된 개념인RVO
(Return Value Optimization
) 를 함께 정리합니다.
C++11
이후 표준에서는 다음 조건이 충족될 때,return
문에서 지역 변수를 반환할 경우 자동으로 이동 연산 을 수행합니다.- 반환하려는 객체가 이름을 가진 지역 변수일 것
- 해당 타입이 복사 불가능(delete된 copy constructor)이며 이동 가능할 것
return var;
형식으로 반환될 것
- 이때 컴파일러는
return var;
구문을 내부적으로return std::move(var);
로 처리합니다.- 이를
Implicit Move
(암시적 이동) 라고 부릅니다.
- 이를
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()
를 호출하지 않아도 됩니다.
-
구분 암시적 이동 ( Implicit Move
)RVO
(Return Value Optimization
)정체 언어 기능 컴파일러 최적화 조건 이동 생성자가 존재하며 지역 변수를 반환할 때 자동 적용 객체 복사 또는 이동 자체를 생략하는 최적화 효과 복사 대신 이동이 수행됨 복사/이동 자체 없이 객체가 반환 지점에 직접 생성됨 결과 return var;
구문이return std::move(var);
처럼 동작객체를 따로 생성하지 않고 바로 반환 메모리에 생성
-
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; // 소멸자 두 번 호출 }
-
unique_ptr
을return
할 때std::move()
는 필요하지 않습니다. -
C++ 표준의 암시적 이동(
Implicit Move
) 기능이 자동으로 적용됩니다. -
컴파일러는 경우에 따라
RVO
를 적용하여 복사/이동조차 생략하기도 합니다. -
필요하면
std::move()
를 써도 문제는 없지만, 가독성을 위해 생략하는 것이 일반적 입니다.
- 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄
728x90
반응형
'C C++' 카테고리의 다른 글
Visual C++ 메모리 누수(momory leaking) 탐지 방안 (0) | 2025.03.20 |
---|---|
std::enable_shared_from_this — 객체 내부에서 안전하게 shared_ptr을 생성하는 방법 (0) | 2025.03.20 |
C++23 std::observer_ptr: 소유권 없는 안전한 포인터 래퍼(pointer wrapper) (0) | 2025.03.20 |
생 포인터(raw pointer) std::raw_pointer — 표준 C++에 존재할까? (0) | 2025.03.20 |
C++ 스마트 포인터(std::unique_ptr, std::shared_ptr, std::weak_ptr) 명시적 해제(reset()) (0) | 2025.03.20 |