Effective C++/Effective STL
[Effective STL] 17. swap 트릭으로 vector 용량 줄이기
김디트
2024. 11. 26. 10:41
728x90
항목 17. 쓸데없이 남은 용량은 "바꿔치기(swap) 묘수"를 써서 없애 버리자
vector의 필요없는 메모리
- 엄청나게 많은 요소가 들어갔다가, 한번에 줄어들면 필요없는 메모리가 벡터에 잔뜩 생긴다.
- 이는 어떻게 처리하면 좋을까?
- 사실, 모던 C++에서는 shrink_to_fit() 함수를 제공한다.
- 벡터의 용량을 현재 크기만큼으로 줄이는 함수이다.
- string도 지원한다.
- 하지만 이를 지원하지 않는다면 어떻게 해결해야 할까?
swap 트릭
class Contestant{ ... };
vector<Contestant> contestants;
...
// 많은 요소를 삽입하고
// 많은 요소를 제거한다.
...
vector<Contestant>(contestants).swap(contestants); // shrink to fit
- vector<Contestant>(contestants)
- 사본 임시 벡터 객체를 만든다.
- 요소가 복사되는데 필요한 만큼의 메모리만을 할당한다.
- swap(contestants)
- 임시 벡터와 contestants를 스왑한다.
- contestants는 필요 없는 용량이 제거된 상태가 된다.
- 임시 객체는 contestants가 사용하고 있던 불필요한 메모리를 가지게 된다.
- 이제 앞의 코드가 끝나면, 임시 객체는 소멸된다.
- 이 트릭은 string에도 사용할 수 있다.
string s;
...
string(s).swap(s);
주의 사항
- 이를 통해 불필요한 메모리가 완벽히 사라진다는 보장은 없다.
- 왜냐하면 vector와 string 구현에 따라 용량 설정이 때문이다.
- 예컨대 몇 바이트 이하로는 절대 줄어들지 않게 하는 하한선이 있다거나.(항목 15 참조)
- 즉, 이 방법은 용량을 최대한 작게 만드는 것이 아니라,
- 컨테이너의 현재 크기(size)에 알맞은 용량으로 작게 만드는 것이다.
- swap을 사용하고 난 후엔 요소 데이터, 반복자, 포인터, 참조자가 모두 바뀐다.
- swap이 일어난 후에도 원래의 컨테이너 요소를 가리키는데 사용되던 모든 반복자, 포인터, 참조자가 유지된다는 점을 조심할 것.
- swap은 컨테이너를 완전히 비우고 용량을 최소치로 줄이는데에도 쓸 수 있다.
vector<Contestant> v;
string s;
...
vector<Contestant>().swap(v);
string().swap(s);
728x90