source

다양한 64비트 데이터 모델과 비교하여 32비트(size_t)의 사이즈는 어떻게 됩니까?

gigabyte 2022. 9. 3. 13:26
반응형

다양한 64비트 데이터 모델과 비교하여 32비트(size_t)의 사이즈는 어떻게 됩니까?

64비트 시스템에서는sizeof(unsigned long)는 시스템에 의해 구현된 데이터 모델에 따라 달라집니다.예를 들어 LLP64(Windows)에서는 4바이트, LP64(Linux 등)에서는 8바이트입니다.뭐가sizeof(size_t)그럴 것 같나?다음과 같은 데이터 모델에 따라 달라집니까?sizeof(long)그래요? 그렇다면 어떻게요?


참고 자료:

Wikipedia의 64비트 데이터 모델

size_t는 size of 연산자(C99 6.3.5.4.4) 및 malloc 및 friends 인수(C99 7.20.3.3 등)의 부호 없는 정수 반환 유형으로 C 표준에 의해 정의됩니다.실제 범위는 최대값(SIZE_MAX)이 최소 65535(C99 7.18.3.2)가 되도록 설정됩니다.

단, size of(size_t)는 결정되지 않습니다.실장에서는 size_t에 대해 원하는 표현을 자유롭게 사용할 수 있습니다.따라서 크기 상한은 없습니다.또한 실장에서는 바이트를 16비트로 정의할 수 있습니다.이 경우 size_t는 부호 없는 문자와 동등할 수 있습니다.

그러나 데이터 모델에 관계없이 일반적으로 32비트 프로그램에서는 32비트 size_t, 64비트 프로그램에서는 64비트 size가 사용됩니다.일반적으로 데이터 모델은 정적 데이터에만 영향을 미칩니다. 예를 들어 GCC에서는 다음과 같습니다.

`-mcmodel=small'
     Generate code for the small code model: the program and its
     symbols must be linked in the lower 2 GB of the address space.
     Pointers are 64 bits.  Programs can be statically or dynamically
     linked.  This is the default code model.

`-mcmodel=kernel'
     Generate code for the kernel code model.  The kernel runs in the
     negative 2 GB of the address space.  This model has to be used for
     Linux kernel code.

`-mcmodel=medium'
     Generate code for the medium model: The program is linked in the
     lower 2 GB of the address space but symbols can be located
     anywhere in the address space.  Programs can be statically or
     dynamically linked, but building of shared libraries are not
     supported with the medium model.

`-mcmodel=large'
     Generate code for the large model: This model makes no assumptions
     about addresses and sizes of sections.

포인터는 모든 경우에 64비트입니다.또한 64비트 포인터는 있어도 64비트 사이즈는 필요 없습니다.

오브젝트의 크기를 나타내기 때문에 아키텍처에 따라 달라집니다.32비트 시스템에서는size_t최소 32비트 너비가 될 수 있습니다.64비트 시스템에서는 최소 64비트 너비가 될 수 있습니다.

size_t는 보통 64비트 머신에서 64비트입니다.

편집: 코멘트 감사합니다.섹션 6.5.3.4에 기재되어 있는 C99 표준에서 검색했습니다.

결과의 값은 구현 정의이며, 그 유형(부호 없는 정수 유형)은 다음과 같습니다.size_t, 로 정의되어 있습니다.<stddef.h>(및 기타 헤더)

그래서 그 사이즈는size_t는 지정되지 않았습니다.단, 부호 없는 정수 타입이어야 합니다.그러나 흥미로운 규격은 표준의 7.18.3장에서 확인할 수 있다.

의 한계.size_t

SIZE_MAX 65535

그 말은 기본적으로, 그 말의 크기와는 상관없이size_t허용되는 값의 범위는 0 ~65535 입니다.나머지는 실장에 의존합니다.

언급URL : https://stackoverflow.com/questions/918787/whats-sizeofsize-t-on-32-bit-vs-the-various-64-bit-data-models

반응형