스토리텔링 개발자

[Effective STL] 17. swap 트릭으로 vector 용량 줄이기 본문

개발/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
Comments