C++

C++ : shrink_to_fit()

Sorting 2020. 12. 13. 14:43
반응형

c++11에서 새로 도입된 함수 shrink_to_fit()은

기존에 swap()밖에 없었던 연속된 메모리를 가진 컨테이너의 capacity를 줄여주는 함수다.

 

vector<int> v; 로 현재 size에 맞게 capacity를 줄이는데 다음 한 줄이면 된다.

 

v.shrink_to_fit();

 

함수의 내부적인 동작은 기존의 swap을 통한 메모리 재할당과 동일하다.

 

이 함수는 non-binding 함수인데, 이것이 의미하는 것은

"컴파일러 회사한테 구현하라고 만들어놨지만, 꼭 구현해야 하는건 아냐" 라고 한다.

 

이 함수가 non-binding 인 이유에 대해서는 stack overflow에서도 말이 많은 것 같지만 

대표적인 이유는 이거다.

너무 비싸서

 

만드는 데 돈이 많이 드는 것이 아니라, 원소를 복사하는데 CPU시간을 너무 많이 낭비할 수 있기 때문이라는 것이다. 

shrink_to_fit()은 기존에 벡터가 가리키고있던 메모리와는 다른, 현재 size만큼의 크기를 가진 새로운 메모리를 할당받아 기존 메모리의 모든 원소를 새로운 메모리로 복사생성하는 과정이 필요하다.

 

이는 기존 데이터가 크면 클 수록 더 많은 시간이 소요된다는 것을 의미한다. 

 

메모리를 할당하는 작업은 매우 비싼 작업(CPU를 오래 점유하는 작업)이기 때문에 

new연산자가 자주 호출되는 것은 비효율적인 작업에 해당된다. 

때문에 메모리 풀이라는 개념을 도입하는 등 최소한으로 줄여야하는 메모리 할당작업을

shrink_to_fit()은 당연하다는 듯이 제공을 하고 있다.

 

원소가 100만개인 배열에서 원소 수가 80만개로 줄었다고 shrink_to_fit()을 해버리면 어떻게 될지는 

불보듯 뻔하다. 이는 STL의 개념에서 약간 어긋났다고 볼 수도 있겠다.

 

물론 편리한 함수긴 하나, 꼭 필요한 함수는 아니다.

애써서 할당해놓은 메모리를 해제하는 건 

고생한 운영체제를 위해 꼭 필요할 때만 쓰도록 하자.

반응형