size_t

덤프버전 :




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를 쓰는 순간 마이너스를 고려해서 두 가지로 써야 한다.

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

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


3. ssize_t[편집]


size_t의 부호형이며 목적은 비슷하다. 주로 저수준 파일 함수나 소켓 라이브러리에서 쓰이는데 이를 반환값으로 쓰이는 함수들은 에러가 발생했을때 0 이하의 값 또는 -1을 반환한다는 점이 다르다.
파일:크리에이티브 커먼즈 라이선스__CC.png 이 문서의 내용 중 전체 또는 일부는 2023-11-06 15:13:23에 나무위키 size_t 문서에서 가져왔습니다.

[1] C++ 스타일 캐스팅[2] C 스타일 캐스팅은 C++ 유저라면 쓰지 않는 것이 좋다. reinterpret_cast 처럼 위험하다.