목차
1. size vs capacity
2. 응용/심화
3. 요약
1. size vs capacity
size : 현재 들어있는 원소 개수를 의미, 논리적 크기, size() 등으로 확인 가능.
capacity : 재할당 없이 담을 수 있는 원소 개수, capacity()로 확인 가능, vector가 보유한 여유 메모리.
-> size가 capacity를 넘어서는 순간 vector는 더 여유있는 곳으로 메모리를 옮기는 재할당을 수행.
-> 당연히 size보다 capacity가 크거나 같음.
- 이 둘을 구분하지 못하면 루프 등에서 재할당이 반복되어 성능이 급락, reserve()는 이 비용을 제어하는 핵심 도구.
- 동적 배열 등은 매 삽입마다 재할당하면 성능이 급락하게 되고 이를 방지하고자 vector는 capacity를 통해 완충재 역할을 수행.
size와 capacity 관련 API

2. 응용/심화
reserve()
reserve(n) 형태로 사용하며 사용할 데이터의 capacity를 미리 확보하여 데이터가 삽입되는 동안 발생하는 불필요한 재할당을 차단.
-> 재할당은 패킷 수집, 로그 버퍼링, 프레임 단위 등 루프에서 치명적.
-> capacity 예약을 위해 낭비되는 메모리보다 재할당으로 인한 시스템 부하가 더 치명적.
ex) 매번 메모리를 새로 할당하는 경우.
void OnReceiveData(int count) {
std::vector<Packet> buffer; // 함수 호출마다 생성, 매번 재할당 발생
for(int i=0; i<count; ++i) {
buffer.push_back(GetPacket());
}
}
ex) reserve를 통해 capacity를 확보하고 메모리를 재사용하는 경우.
// 클래스 멤버로 선언하여 메모리를 유지
std::vector<Packet> m_workBuffer;
void OnReceiveData(int count) {
// 1. 필요한 만큼 미리 공간 확보 (이미 크면 아무 일도 안 함)
if (m_workBuffer.capacity() < (size_t)count) {
m_workBuffer.reserve(count);
}
// 2. 기존 데이터만 논리적으로 제거 (메모리는 유지됨)
m_workBuffer.clear();
for(int i=0; i<count; ++i) {
m_workBuffer.push_back(GetPacket()); // 재할당 없이 고속 삽입
}
}
reserve & resize 혼동
reserve() : size를 증가시키지는 않음.
resize() : size를 증가시켜 실제 원소를 생성.
ex) 비어있는 vector에 resize() 후 operator[]로 접근하면 안전.
ex) 비어있는 vector에 reserve() 후 operator[]로 접근하면 정의되지 않은 동작.

3. 요약
size : 실제 존재하는 원소 개수.
capacity : 재할당 없이 담을 수 있는 원소 개수.
reserve() : capacity(메모리)를 여유 있게 확보하기 위한 메서드, 생성자 호출되지 않음, 재할당 발생 시 일시적 비용 발생.
-> 성능 최적화에 권장.
size() : 실제 요소 개수 조정을 위한 메서드, 생성자 호출됨, 크기에 따라 비용 발생.
-> 초기화된 데이터가 즉시 필요한 경우 등 사용.
'Develop > Language - C++' 카테고리의 다른 글
| [C++] sprintf() vs snprintf() (1) | 2026.01.23 |
|---|---|
| [C++] _wtoi, wcstoul (0) | 2026.01.23 |
| [C++] size_t (0) | 2026.01.23 |
| [C++] 정적 멤버선언 vs 동적 멤버 할당 (1) | 2026.01.23 |
| [ C++] 오버로딩 vs 오버라이딩 (0) | 2026.01.22 |