vector와 string에 있어서의 메모리 증가는 재할당이란 과정을 거쳐서 이루어 진다.(현재 사이즈의 증가가 아닌 컨테이너에서 할당해놓은 메모리가 부족해 질때)
- 컨테이너의 현재 용량의 몇배가 되는 메모리 블록을 새로 할당 (일반적으로 2배)
- 컨테이너가 가지고 있었던 메모리에 저장된 모든 요소 데이타(객체)를 새 메모리에 복사
- 원래 메모리에 저장된 모든 객체를 소멸
- 원래의 메모리를 해제
이런 오버헤드를 줄이기 위해서 필요한 만큼의 메모리를 미리할당하고 데이타를 삽입한뒤 관리하는 방식을 사용할수 있다. 이때 사용하는것이 reserve 이다.
예를 들어
vector<int> v;
for(int i=0; i<1000; i++) v.push_back(i);
vector<int> v;
v.reserve(1000);
for( int i=0; i<1000; i++ ) v.push_back(i);
그리고 size와 capacity의 관계를 잘 생각해보면 요소 삽입시 vector나 string에서 재할당이 일어나는 시기를 예측할수 있다.
string s;
…
if( s.size() < s.capacity() ) s.push_back(‘X’);
정리하면 reserve를 이용해서 불필요한 메모리 재할당을 피하는 방법은 두가지 정도 이다.
- 컨테이너에 저장될 요소의 개수를 미리 파악해서 정확한 reserve 호출
- 컨테이너에 저장될 최대 요소의 개수를 할당하고 요소 삽입후 남는 메모리를 삭제 (EffectiveSTL17 을 참고)
참고
|