[C++] Vector를 사용할때 Capacity 가 중요한 이유
Q. Vector로 자료구조 좀 치시나요?
저 잘 못칩니다. 잘치고 싶어요. 그래서 공부합니다.
잘 치려면 vector를 더 잘 알아야죠. 뭐 push_front, push_back, pop_front, pop_back은 알고 있지만, 이것들을 어떻게 써야 메모리가 더 효율적인가, 이런걸 알아야죠.
Q. 하나만 알려줘봐요.
오늘 메인 주제. Capacity에 관한 내용. 바로 들어갑니다.
Vector 의 구성요소
3가지만 생각합시다. 1. ptr 2. size 3. capacity
순서대로,
1. ptr : 포인터 주소 이건 vector의 메모리상 주소 이고,
2. size : 벡터의 크기
3. capacity : 벡터의 용량 입니다.
이번 글에서 다뤄볼 것은 capacity 가 왜 중요한가요. 라는 주제.
Vector 할당의 시나리오
보기좋게 순서대로 나열해봅니다.
1. Vector ptr 선언
2. Vector ptr 에 malloc 등으로 메모리 할당. (여기서 capacity 도 주어집니다. malloc(n) 에서 n이 capacity의 개념)
3. size는 당연히 Vector<T> 에서 T의 크기 * vector 원소의 수 겠죠?
Capacity 가 그래서 왜 중요한건데요?
핵심 내용입니다. 우리는 vector 를 동적 메모리로 할당 하였기 때문에 heap 영역에서 다루고 있는거죠. 그리고 heap 영역은 무분별하게 여기저기 메모리를 사용중입니다. 만약 최초 선언한 ptr에서 capacity 가 변경되었고, 다음 영역(순서상 ptr에 할당된 주소 다음번지)이 이미 사용중인 메모리라면? 할당 해줄 수 없겠죠.
그렇게 되면 새로 변경된 capacity 만큼 할당할 수 있는 주소지로 ptr이 변경되게 됩니다. 여기서 발생하는 cost 는 깊은 복사겠죠. 너무 큽니다.
결론지어주세요.
Vector를 사용하는 이유는 단언컨데 성능 입니다. 그런데 메모리 할당, 객체 복사등의 이유로 이 성능이 저하되면 큰 타격이 있겠죠.
Capactiry 와 관련 해서 이런 성능 저하 과정이 일어날 수 있고, 이를 사전에 방지 하기 위해선 해당 벡터가 어느 크기로 사용되겠다. 대략의 capacity를 정한 뒤, vector.reserve(n)과 같은 함수로 할당 해주는 것이 중요하다 입니다.