최근 수정 시각 : 2024-04-07 14:04:27

size_t


프로그래밍 언어 문법
{{{#!wiki style="margin: -16px -11px; word-break: keep-all"<colbgcolor=#0095c7><colcolor=#fff,#000> 언어 문법 C(포인터) · C++(자료형 · 특성 · 클래스 · 이름공간 · 상수 표현식) · C# · Java · Python · Kotlin · MATLAB · SQL · PHP · JavaScript
마크업 문법 HTML · CSS
개념과 용어 함수 · 인라인 함수 · 고차 함수 · 람다식 · 리터럴 · size_t · 상속 · 예외 · 조건문 · 참조에 의한 호출 · eval
기타 == · === · NaN · null · undefined · 모나드 · 배커스-나우르 표기법
프로그래밍 언어 예제 · 목록 · 분류 }}}

1. 개요2. 설명3. ssize_t

1. 개요

C/C++ 에서 쓰이는 데이터 타입이다. C80/C90 표준에 정의되어 있다.

2. 설명

size_t는 해당 시스템에서 어떤 객체나 값이 포함할 수 있는 최대 크기의 데이터를 표현하는 타입으로 반드시 unsigned 형으로 나타낸다. stddef.h 및 cstddef 헤더에 정의되어 있다.

아래는 C99 원문.
size_t can store the maximum size of a theoretically possible object of any type
해당 명세에 따르면 x86은 32비트, x64는 64비트 변수가 된다.

C++에서는 stddef.h 대신 cstddef를 include하면 std::size_t로도 쓸 수 있으며 명세도 C와 동일하다.

표준이라는 점과는 별개로 이 자료형의 효용성에 의문을 갖는 프로그래머들이 꽤 많은데, 이유는 다음과 같다.
  • unsigned.
    • 가장 골치아픈 변수 버그들 중 하나인 unsigned와 signed 변수의 혼합 계산 오류 때문에 쓰기가 꺼려진다. 정말 잘 제어해서 쓰거나 다른 연산이 불필요한 for 루프 카운터에만 쓰는 식이 아니라면 이 문제가 언제 터질지 모른다. 오버플로우나 막장 연산자 혼합문제와 비슷한 양상의 계산 버그가 생길 수 있다.
  • 어쩔 수 없이 size_t를 쓰게 되었는데 signed로의 변환이 필요하다면 캐스팅을 써야 하는데, 이 과정에서 성능 하락이 있을 수 있다. 반대로도 마찬가지다.
  • 역방향 루프 같은 경우에는 쓰려면 일부러 복잡하게 바꿔야 한다. 그냥 int 같은 걸 쓰면 알고리즘이 좀 달라도 비슷하게 쓸 수 있는 문장을 size_t를 쓰는 순간 마이너스를 고려해서 두 가지로 써야 한다.

표준 라이브러리은 죄다 size_t로 고정되어 있기 때문에 어쩔 수 없이 컴파일 경고를 없애기 위해 써야 하는 경우도 꽤 있다.

size_t의 대체품을 찾는다면 쓸 수 있는 가장 좋은 것은 int, 필요하다면 unsigned int이며, C++11 이후로는 auto를 써 주면 개발 편의성도 잡고 컴파일 경고까지 쉽게 없애줄 수 있다. auto가 지원이 안 된다면 static_cast<int>(value) [1], (int)value [2]들을 활용하면 강제로 size_t의 문제점에서 벗어날 수 있다.

3. ssize_t

size_t의 부호형이며 목적은 비슷하다. 주로 저수준 파일 함수나 소켓 라이브러리에서 쓰이는데 이를 반환값으로 쓰이는 함수들은 에러가 발생했을때 0 이하의 값 또는 -1을 반환한다는 점이 다르다.
[1] C++ 스타일 변환[2] C 스타일 변환은 C++ 유저라면 쓰지 않는 것이 좋다. reinterpret_cast 처럼 위험하다.