TL;DR
- Cpp 에는 “소유” 라는 개념이 있고,
std::move
함수로 이 소유권을 변경할 수 있다. - 다음의 예시로 살펴보자 1.
#include <iostream>
#include <memory>
class Example {
public:
auto Print() -> void { std::cout << "Example" << std::endl; }
};
int main() {
// Smart pointer 의 Copy constructor 를 사용하면 두 포인터가 동일하다.
auto original = std::make_shared<Example>();
auto copied = std::shared_ptr<Example>(original);
// 즉, 이건 참이어라.
std::cout << std::boolalpha << (original == copied) << std::endl;
// 하지만 Move constructor 를 사용하면 달라지게 된다.
auto moved = std::move(original);
// 즉, 이건 거짓이지만,
std::cout << std::boolalpha << (original == copied) << std::endl;
// 이건 참이어라.
std::cout << std::boolalpha << (copied == moved) << std::endl;
// 조심할 것은 그래도 `original` 이 `nullptr` 가 되지는 않는다;
// 그냥 다른 오브젝트로 분리되는 것
}
true
false
true
shared_ptr
에서 그냥 copy constructor 를 사용하는 것 보다move
를 사용하면 더 빠르다고 한다.- 당연히
shared_ptr
에서의 copy constructor 는 atomic 하게 reference counter 를 증가시켜야 하기 때문에 다소 느려지기 때문 (출처일세)
- 당연히
Footnotes
-
내용과는 아무런 연관이 없는 넋두리이긴 하지만, 이럴 때 보면 Go by example 처럼 주석이 아니라 코드 옆에 나란히 보여주는 디자인이 부럽다. ↩