size_t

최근 수정 시각: (5년 전)

1. 개요 [편집]

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

2. 설명 [편집]

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

아래는 C99 원문.
size_t can store the maximum size of a theoretically possible object of any type

해당 명세에 따르면 x86은 32비트, x64는 64비트 변수가 된다.

C++에서는 std::size_t로도 쓸 수 있으며 명세도 C와 동일하다.


표준이라는 점과는 별개로 이 자료형의 효용성에 의문을 갖는 프로그래머들이 꽤 많은데, 이유는 다음과 같다.
  • unsigned.
    • 가장 골치아픈 변수 버그들 중 하나인 unsigned와 signed 변수의 혼합 계산 오류 때문에 쓰기가 꺼려진다. 정말 잘 제어해서 쓰거나 다른 연산이 불필요한 for 루프 카운터에만 쓰는 식이 아니라면 이 문제가 언제 터질지 모른다. 오버플로우나 막장 연산자 혼합문제와 비슷한 양상의 계산 버그가 생길 수 있다.
    • 굳이 한 비트 더 써서 최대치를 늘릴 필요가 별로 없다. 32비트만 해도 최대치가 원체 높아서 넘어갈 가능성이 거의 없는데다 혹시나 최대치를 넘길 경우 signed는 음수값 오류 체크라도 가능하지 unsigned는... 답이 없다.
    • 위 정보는 잘못된 정보이다. signed 자료형의 overflow는 undefined-behavior이다. [1]
  • 어쩔 수 없이 size_t를 쓰게 되었는데 signed로의 변환이 필요하다면 캐스팅을 써야 하는데, 이 과정에서 성능 하락이 있을 수 있다. 반대로도 마찬가지다.
  • Visual Studio는 size_t를 비표준으로 구현해두었다. 그래서 특히 구버전 컴파일러는 이 자료형을 이상하게 취급한다. 매크로 문제도 있다. 간혹 이걸 '구조체 비트필드' 로 구현해놓은 충공깽인 경우도 있다. 이러면 통상의 변수처럼 쓸 수가 없어진다.
  • 추가 헤더 #include <cstddef>, <stddef.h> 가 필요하다. 표준 라이브러리 구현에 따라 안 넣어도 자체포함하는 경우도 있다.
  • 코딩 일관성을 해친다.
    • 타겟 플랫폼에 따라 가변적으로 최대치가 변해버리기 때문에 제어하기 힘들며 [2]
    • 역방향 루프 같은 경우에는 쓰려면 일부러 복잡하게 바꿔야 한다. 그냥 int 같은 걸 쓰면 알고리즘이 좀 달라도 비슷하게 쓸 수 있는 문장을 size_t를 쓰는 순간 마이너스를 고려해서 두 가지로 써야 한다.
    • 쓰는 사람에 따라 size_t, std::size_t 두 종류의 문법이 있는 것도 문제다. 간혹 ::size_t 로 쓰는 사람도 있다. 표준이 왜 이래
    • std::size_t는 구버전 코드에서는 잘 동작하지도 않는다. 특히 C에서는 잘 안 먹힌다.
  • 변수 용량 최대치라는 점은 지금 현재로써는 int를 쓰면 가변적으로 거의 잘 맞춰주며 예전처럼 메모리 공간에 목숨거는 환경이 아니라는 점도 크다. 임베디드 개발이 아니라면야
  • size_t, 특히 std::size_t는 단어도 훨씬 긴데다 치기 껄끄러운 ::과 _까지 있다. 타자 편의성에서 압도적으로 밀린다.


가장 큰 문제인 unsigned를 떼 버리기 위해 자체적으로 대용품 자료형을 만들어두는 경우도 있을 수 있다. 왜 표준에는 signed size_t가 없는가

그러나 STL은 몽땅 다 size_t로 고정되어 있기 때문에, 어쩔 수 없이 컴파일 경고를 없애기 위해 써야 하는 경우도 꽤 있다.

size_t의 대체품을 찾는다면 쓸 수 있는 가장 좋은 것은 int, 필요하다면 unsigned int이며, C++11 이후로는 auto를 써 주면 개발 편의성도 잡고 컴파일 경고까지 쉽게 없애줄 수 있다. auto가 지원이 안 된다면 static_cast<int> [3], (int) [4] 캐스팅을 이용하면 강제로 size_t의 문제점에서 벗어날 수 있다.
[1] (정보에 대한 출처(C11 표준 문서, ISO/IEC 9899:2011 committee draft 6.5.5): https://web.cs.dal.ca/~vlado/pl/C_Standard_2011-n1570.pdf) - 원문 : If an exceptional condition occurs during the evaluation of an expression (that is, if the result is not mathematically defined or not in the range of representable values for its type), the behavior is undefined.[2] 특히 메모리 공간 제어가 필수인 게임 개발 같은 경우 가변 자료형은 최적화 최대 기피사항 중 하나다. typedef나 using으로 멀티플랫폼 처리를 해서 쓰는게 보통이다.[3] C++ 스타일 캐스팅[4] C 스타일 캐스팅은 C++ 유저라면 쓰지 않는 것이 좋다. reinterpret_cast 처럼 위험하다.

라이선스를 별도로 명시하지 않은 문서는 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다.
기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.

문서의 기여자는 역사 탭에서 확인할 수 있습니다.
접두어의 N: - 나무위키 사용자, R: - 리그베다 위키의 사용자를 뜻합니다.
자세한 사항은 나무위키에서 동일한 문서의 역사를 참고하시기 바랍니다.