일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 메타테이블
- 비교 함수 객체
- 참조자
- 언리얼
- 예외
- 영화 리뷰
- 게임
- 반복자
- virtual function
- implicit conversion
- 루아
- more effective c++
- Vector
- 영화
- Smart Pointer
- 다형성
- 오블완
- reference
- exception
- 스마트 포인터
- 상속
- UE4
- c++
- operator new
- effective stl
- resource management class
- 암시적 변환
- 티스토리챌린지
- Effective c++
- lua
Archives
- Today
- Total
스토리텔링 개발자
[Effective STL] 17. swap 트릭으로 vector 용량 줄이기 본문
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
'개발 > Effective STL' 카테고리의 다른 글
[Effective STL] 19. 상등(equality)과 동등(equivalence) 관계 (0) | 2024.11.29 |
---|---|
[Effective STL] 18. vector<bool> 주의 (0) | 2024.11.27 |
[Effective STL] 16. C API로 컨테이너 전달 (0) | 2024.11.25 |
[Effective STL] 15. string 구현 방식 (0) | 2024.11.22 |
[Effective STL] 14. vector reserve (0) | 2024.11.21 |
Comments