목차
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 |