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의 개념에서 약간 어긋났다고 볼 수도 있겠다.
물론 편리한 함수긴 하나, 꼭 필요한 함수는 아니다.
애써서 할당해놓은 메모리를 해제하는 건
고생한 운영체제를 위해 꼭 필요할 때만 쓰도록 하자.
'C++' 카테고리의 다른 글
C++20 : std::ranges #2 - iota_view 만들기 (0) | 2021.03.22 |
---|---|
C++20 : std::ranges #1 - views (0) | 2021.03.17 |
L1 캐시는 왜 Data와 Inst로 나뉘어 있나요? (번역) (0) | 2020.12.13 |
TBB - 병렬 컨테이너 사용 (concurrent_hash_map) : GameServer에서 유저의 <id, index> 정보 관리 (0) | 2020.12.13 |
cocos2d-x 3.0 draw line (선 그리기) (0) | 2020.12.13 |