size_t
존재해야하는 이유 와 여기에 도달 한 방법 으로 이동하려면 :
실제로 는 64 비트 구현에서 64 비트 너비, 32 비트 구현에서 32 비트 너비 size_t
등 ptrdiff_t
이 보장됩니다. 기존 유형을 강제하여 모든 컴파일러에서 레거시 코드를 손상시키지 않고 모든 컴파일러에서 의미 할 수는 없습니다.
size_t
또는 ptrdiff_t
반드시 동일하지 않습니다 intptr_t
나 uintptr_t
. 그들은 아직 사용했다 때 특정 아키텍처에서 달랐다 size_t
하고 ptrdiff_t
(예 : 16 비트 Windows 등) 80 년대 후반에 표준을 첨가하고, C99 많은 새로운 유형을 추가 할 때 쓸모가되고 있지만, 아직 사라 없습니다. 16 비트 보호 모드의 x86에는 가능한 최대 배열 또는 구조의 크기가 65,536 바이트 일 수있는 세그먼트 화 된 메모리가 있었지만 far
포인터는 32 비트, 레지스터보다 넓은 폭이어야했습니다. 이들에, intptr_t
32 비트 폭했을 것이다 그러나 size_t
및ptrdiff_t
너비가 16 비트이고 레지스터에 맞을 수 있습니다. 그리고 앞으로 어떤 종류의 운영 체제가 작성 될지 누가 알았습니까? 이론적으로 i386 아키텍처는 운영 체제가 실제로 사용하지 않은 48 비트 포인터를 가진 32 비트 세그먼트 화 모델을 제공합니다.
long
너무 많은 레거시 코드 long
가 정확히 32 비트 너비 라고 가정하기 때문에 메모리 오프셋의 유형이 될 수 없습니다 . 이 가정은 심지어 UNIX 및 Windows API에 내장되었습니다. 불행히도, 다른 많은 레거시 코드는 또한 long
포인터, 파일 오프셋, 1970 년 이후 경과 된 초 수 등을 담을 수있을 정도로 넓다고 가정 했습니다. POSIX는 후자 가정을 전자가 아니라 사실로 강제하는 표준화 된 방법을 제공하지만, 이식 가능한 가정은 아닙니다.
int
90 년대의 소수의 컴파일러 만이 int
64 비트 폭을 만들었 기 때문에 불가능했습니다 . 그런 다음 long
32 비트 너비 를 유지하여 정말 이상했습니다 . 다음 표준 개정판은을 ( int
를) 초과하는 것이 불법이라고 선언 long
했지만 int
대부분의 64 비트 시스템에서 여전히 32 비트입니다.
long long int
32 비트 시스템에서도 너비가 64 비트 이상으로 만들어지기 때문에 나중에 추가 할 수 없었 습니다.
따라서 새로운 유형이 필요했습니다. 그렇지 않은 경우에도 다른 모든 유형은 배열 또는 객체 내의 오프셋 이외의 것을 의미합니다. 그리고 32 비트에서 64 비트로의 마이그레이션에 대한 한 가지 교훈이 있다면, 유형에 필요한 속성을 구체적으로 설명하고 다른 프로그램에서 다른 것을 의미하는 속성을 사용하지 않아야했습니다.
int
경우some_size
서명size_t
이없는 경우 if 가 사용 됩니다 .