프로그래밍 언어 문법 | ||
{{{#!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. 개요
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 typeC++에서는 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
의 문제점에서 벗어날 수 있다.