티스토리 뷰

 C++11 에서 이동 연산이 추가된 이유는 아무래도 성능 개선 때문일 것이다. 이 때문에 우리는 항상 이동 연산을 사용하면 빠를것이다라고 기대하는데 현실은 아닐 수 있다. 이동 연산을 지원하지 않는 클래스일수도 있고, 성능이 생각보다 좋아지지 않는것일수도 있다. std::vectorstd::array 를 비교하며 살펴보도록 하자. 

 먼저 std::vector 를 살펴보자. std::vector 의 내부에서는 힙 메모리를 이용하여 자료들을 저장하고 이 힙 메모리를 가르키는 포인터를 이용해서 동작한다. 덕분에 std::vector 를 이동시키게 되면, 포인터를 전달하면 되기 때문에 상수 시간에 이동이 끝난다.

 반면에 std::array 는 내장 배열에 인터페이스를 씌워놓은 형태이다. 이동을 하게 되면 내장 배열에 있는 자료들을 하나하나 이동시켜야한다. 그렇기 때문에 이동 또한 선형 시간이 필요하며, 수행 시간이 복사와 크게 차이가 나지 않는다.

 이외에도 std::string 에서도 문제는 나타난다. std::string 은 상수 시간 이동과 선형 시간 복사를 제공한다. 그럼에도 이동이 빠르지 않을 수 있다. 그 이유는 SSO 라고 불리는 작은 문자열 최적화 때문이다. 작은 문자열의 경우 std::string 은 힙이 아닌 버퍼에 저장한다. std::array 와 같은 문제이다.

 

참고 서적

스콧 마이어스, Effective Modern C++
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함