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

Develop/Language - C++

[C++] size_t

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

목차

1. size_t

2. 응용/심화

3. 요약

 


1. size_t

size_t :

메모리 크기, 배열 인덱스 등을 표현하기 위한 부호 없는(Unsigned) 정수 타입.

32비트 시스템에서는 32비트, 64비트 시스템에서는 64비트로 사용되며 즉, 주소 공간 전체를 가리킬 수 있음.

일반적으로 sizeof 함수의 결과 타입이며, 결과가 음수의 의미를 갖는 경우 signed 타입이 필요함.

 

 


2. 응용/심화

int형과의 차이

int형 :

연산 및 로직에 쓰는 일반 정수 타입, 크기 및 부호는 플랫폼에 따라 차이가 있음.

실무에서 signed 혹은 unsigned 혼합으로 혹은 32/64비트에서 오버플로우 발생이 잦음.

C++ 표준에서는 최소 16비트 이상으로만 규정되어 있으며 현대 윈도우 64비트 아키텍처에서 여전히 32비트인 경우도 존재.

부호가 있어서 음수 ㅍ현이 가능하나 양수 표현 범위는 size_t의 절반에 미치지 못함.

 

 

size_t의 언더플로우와 무한루프

// [위험한 코드] 역순 순회 시 흔한 실수
for (size_t i = v.size() - 1; i >= 0; --i) { 
    // i가 0일 때 --i를 하면 최대값으로 변하며 무한 루프 발생!
}

 

- size_t는 부호가 없기 때문에 0에서 -1을 연산하는 순간 해당 시스템의 최대값으로 변경.

 

 

64비트 환경에서의 데이터 잘림(Truncation)

// [장애 발생 코드]
std::vector<char> buffer = LoadLargeFile(); 
int dataSize = buffer.size(); // 64비트 환경에서 buffer.size()는 64비트, int는 32비트.
// 파일이 2GB(또는 4GB)를 넘는 순간 dataSize는 음수가 되거나 잘린 값이 들어감.

 

- size() 함수는 size_t를 리턴 값으로 가지며 이는 64비트 환경에서 64비트 결과값을 반환.

- int형은 32비트 값을 가지므로 만약 32비트를 넘어서는 값을 반환 받으면 dataSize는 음수 혹은 잘리게 됨.

- 이후 memcpy 등에서 dataSize를 사용하면 버퍼 오버플로우 발생.

 

 

size_t 오버플로우 방지 습관

bool MulOverflowSizeT(size_t a, size_t b, size_t* out)
{
    if (a == 0 || b == 0) { *out = 0; return false; }
    if (a > (size_t)(-1) / b) return true; // overflow
    *out = a * b;
    return false;
}

 

- if (a == 0 || b == 0) { *out = 0; return false; }

 : a 혹은 b가 0인 경우 이후 나누기 연산에서 0으로 나누는 경우 에러가 발생하기 때문에 return 처리.

- if (a > (size_t)(-1) / b) return true;

 : (size_t)(-1)을 통해 size_t가 가질 수 있는 가장 큰 값을 계산하여 a*b가 해당 값을 넘어서지는 않는지 체크하고 true(오버플로우) 반환.

 

 

size_t 관련 안전 가이드

1. 컨테이너 인덱스는 반드시 size_t 혹은 auto를 사용.-> std::vector<T>::size_type은 size_t, int i로 루프를 돌리는 습관 주의.

 

2. 부호 있는 정수와 없는 정수 비교 지양.-> 음수 부호를 지원하는 타입과 지원하지 않는 타입 간 비교 구문은 컴파일로 경고를 발생, 이에 주의. (잘못된 비교 결과)

 

3. 고정 폭 정수(cstdint)의 활용.-> 통신 프로토콜 같이 바이트 단위가 중요한 경우 플랫폼에 따라 동적인 int 혹은 long과 달리 int32_t, uint64_t 등을 사용하여 데이터 규격화.

 


3. 요약

size_t : 플랫폼에 따라 가변적인 부호 없는 정수 타입, 일반적으로 크기/인덱스 표현을 위해 사용.

int : 16비트(가변적) 부호를 가진 정수 타입, 일반적으로 연산용으로 사용.

- size_t를 사용하는 경우 음수 체크 등을 통해 오버플로우를 방지하는 코드 작성을 습관화.

반응형

'Develop > Language - C++' 카테고리의 다른 글

[C++] _wtoi, wcstoul  (0) 2026.01.23
[C++] Size vs Capacity  (0) 2026.01.23
[C++] 정적 멤버선언 vs 동적 멤버 할당  (1) 2026.01.23
[ C++] 오버로딩 vs 오버라이딩  (0) 2026.01.22
[C++] typedef  (0) 2026.01.22