시작은 미미하나 끝은 쥬쥬하리라.

Develop/Language - C++

[C++] Size vs Capacity

코딩뚜벅이 2026. 1. 23. 14:57
반응형

목차

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