KoreanFoodie's Study

Effective Modern C++ | 항목 29 : 이동 연산이 존재하지 않고, 저렴하지 않고, 적용되지 않는다고 가정하라 본문

Tutorials/C++ : Advanced

Effective Modern C++ | 항목 29 : 이동 연산이 존재하지 않고, 저렴하지 않고, 적용되지 않는다고 가정하라

GoldGiver 2022. 10. 26. 10:03

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다!

항목 29 : 이동 연산이 존재하지 않고, 저렴하지 않고, 적용되지 않는다고 가정하라

핵심 :

1. 이동 연산들이 존재하지 않고, 저렴하지 않고, 적용되지 않을 것이라고 가정하자.
2. 형식들과 이동 의미론 지원 여부를 미리 알 수 있는 경우에는 그런 가정을 둘 필요가 없다.


아마 C++11 에서 가장 주된 가능은 이동 의미론(move semantics) 일 것이다. 하지만 모든 경우에 이동 연산이 가능한 것은 아니고, 또 복사보다 저렴한 것은 아니다.
예를 들어, std::vector 의 경우 std::move 연산은, 컨테이너에 있는 요소들을 가리키는 포인터만 바꿔줌으로써 상수 시간에 동작이 일어나는 것을 보장한다. 그러나 std::array 의 경우, 각 요소를 옮겨야 하므로 std::move 가 선형 시간이 소요된다.
std::string 은 상수 시간 이동과 선형 시간 복사를 제공한다. 이동이 복사보다 빠를 것 같지만, 문자열 구현 중에는 작은 문자열 최적화(small string optimization, SSO)를 이용하는 것들이 많다. 그런 구현은 '작은' 문자열(이를테면 용량이 15자 이하)을 std::string 객체 안의 버퍼에 저장하고, 힙에 할당한 저장소는 사용하지 않는다. 따라서 SSO 기반 구현을 사용하는 경우, 작은 문자열의 이동은 복사보다 빠르지 않다. 또한 예외 안전성 이슈 때문에, 이동 연산이 적합하다고 해도, 해당 이동 연산이 noexcept 로 선언되어 있지 않으면 컴파일러가 복사 연산을 호출할 수 있다.
다음은 C++11 의 이동 의미론이 도움이 되지 않는 몇 가지 시나리오이다.

  • 이동 연산이 없다
  • 이동이 더 빠르지 않다
  • 이동을 사용할 수 없다(예외 및 noexcept 문제)
  • 원본 객체가 왼값인데, 오직 오른값만 이동 연산의 대상이 된다
Comments