상세 컨텐츠

본문 제목

[C++11] Move Semantics

C++/Modern C++(11, 14, 17, 20)

by deulee 2023. 8. 28. 16:13

본문

"Move Semantics(이동 의미론)"은 C++11로부터 도입된 핵심적인 개념으로, 객체의 "소유권"을 전환하거나 "전달"하는 방식을 나타낸다.

 

이는 C++에서 더 효율적인 객체 복사와 동적 자원 관리를 가능하게 해준다.

 

"Move Semantics"를 이용하면 임시 객체rvalue로부터 객체의 리소스를 효율적으로 이동시켜 새로운 객체를 생성하거나 기존 객체에 리소스를 할당할 수 있다. 이를 통해 복사 대신 리소스의 소유권을 이전함으로써 성능을 최적화시킬 수 있다.

 

특히, 동적 메모리 할당과 같이 무거운 작업에서 효율적이다.

 

그럼 주로 어디에서 사용할까?

  • 객체의 수명이 다할때

  • 객체가 일시적으로 사용될 때
     
  • `std::move`로 인해 명시적으로 호출될 때

보통 이 세 가지 상황에서 사용되는데 다음의 예시를 들도록 하겠다.

 

`std::vector`의 경우 "이동"을 하게 되면 단순히 몇개의 포인터를 복사하고 내부의 상태를 새로운 벡터에 넘기게 될 것이다. 하지만 "복사"를 하게 된다면 벡터의 포함되어 있는 모든 요소를 일일이 복사하게 될 것이다. 어차피 기존의 객체는 곧 파괴될텐데 말이다.

 

또한, 복사가 불가능한 타입 (`std::unique_ptr`)과 같은 타입도 이동이 가능하게 해준다.

 

이를 코드로 이용한 내용은 다음 글을 참고하자.

 

https://deulee.tistory.com/121

 

[C++11] Rvalue references

"Rvalue reference"는 C++11에서 도입된 기능으로 오로지 Rvalue에만 할당될 수 있는 새로운 레퍼런스이다. 이를 선언하는 방법은 다음과 같다. T&& // where T is non-template type parameter (such as int, or a user-defined

deulee.tistory.com

https://deulee.tistory.com/101

 

[C++11] Special member functions for move semantics

복사 생성자와 복사 대입 연산자는 복사본이 만들어질 때 호출됐었다. 하지만 C++11의 `move semantics`가 생기면서 `move constructor`와 `move assignment operator`를 만들 수 있게 되었다. #include class B { public: st

deulee.tistory.com

 

관련글 더보기