programing

size_t가 size입니까?

sourcejob 2023. 9. 11. 21:37
반응형

size_t가 size입니까?

이스size_t코드를 컴파일한 기계의 단어 크기?

로 구문 하기, 의 컴파일러 보기 g++ 하기 의 로 하기 의 size_t…의 한 long unsigned int으로 . 가 으로 를 합니까 합니까?size_t 이다, size_t실제로 어떤 미리 저장된 매크로 안에 타이핑되어 있습니다.stddef.h컴파일러가 호출되기 전의 단어 크기로?

아니면 제가 궤도를 한참 벗어난 건가요?

( / "C++ 에서 [support.type] (18.2) /6: "size_t는 모든 개체의 크기(바이트 단위)를 포함할 수 있을 정도로 충분히 큰 구현 정의 부호 없는 정수 유형입니다."

이것은 "단어 크기"와 동일할 수도 있고 그렇지 않을 수도 있습니다.

아니요;size_t코드를 실행할 시스템의 '단어 크기'(교차 컴파일의 경우) 또는 코드를 컴파일한 시스템(코드를 컴파일한 동일한 유형의 시스템에서 코드가 실행되는 정상적인 경우)이 의미하는 것은 아닙니다.구현에서 할당할 수 있는 가장 큰 개체의 크기(바이트 단위)를 유지할 수 있을 만큼 충분히 큰 부호 없는 정수 유형입니다.


의 의 일부sizeof그리고.size_t

언제인지 몰라.size_t정확히 소개가 되었지만, 1979년에서 1989년 사이였습니다. C 에는 1978년 K&R The C Programming Language에 대한 .size_t Unix 에는 . 7 에는 에 이 이 에 에는 size_t그건 1979년부터 시작된 일입니다1984년 커니건과 파이크가 쓴 "유닉스 프로그래밍 환경"이라는 책에는 다음에 대한 언급이 없습니다.size_t에서 (로의 는의malloc()아니면free()도), 암시적인 일 뿐 결정적인 것은 .), 도 한 일 인 은 은 뿐 인 은 일 한 은 . C89은을다고히다c고se은을히yc9d.size_t.

는 C99 는 과 를 를 는 과 sizeof()그리고.size_t:

6.5.3.4 작업자의 크기

을 하는 이 이 등의 기능을 사용하기 입니다.malloc그리고.freadsizeof(char)◦ ◦ 인 경우에도 C 가 가장 하며, 는 이러한 가장 단위의 됩니다.실제로는 이 단위가 36비트 너비인 경우에도 C 항의 바이트가 가장 작은 저장 단위임을 의미하며, 모든 개체는 이러한 가장 작은 단위의 정수로 구성됩니다.메모리가 비트 주소 지정 가능한 경우에도 적용됩니다.로 K&R Ⅰ C89 Ⅱ의 하였습니다.sizeof연산자는 부호가 없는 정수 유형의 상수입니다.구현 및사용은 종종 현인은종다해과고이인및다t고en과s,d인negs,e현t및n이int를 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .int코드를 . C89 위원회는 잘못된 코드를 보호하기 위해 언어를 바꾸는 것이 적절하다고 생각하지 않았습니다.

.sizeof (에는 이든 에 됩니다 ( 에 ) )<stddef.h>)로서size_t가 이할 수 에, 가 할 이 입니다 하기 을 입니다 하기 이 가 을 할 .이구은로다다로은sys이tt구e size_t기존의 부호 없는 정수 형식의 동의어가 됩니다.,로,록이지만size_t서명되지 않은 유형입니다sizeof가 너무 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔΔ Δ ΔΔ Δ ΔΔ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δsize_t 큰 a, 한 가 는 입니다 를 을 도 입니다 을 .unsigned long 또는 C89는 C89에uintmax_t99에서 배열에 r,entynencssorfdmyesyy 이는 모든 배열에 대해aN요소,요소,

N == sizeof(a)/sizeof(a[0])

따라서size_t배열 이며, 함수에 사용되고 있습니다.[...]는 여러 라이브러리 함수에 됩니다. [...]

7.17 일반적인 정의

<stddef.h>되는 여러 를 제공하기 는와께리는러와의다를된기해다s된해기를ad의r는d와와께yson:s .ptrdiff_t,size_t,wchar_t,그리고.NULL 중 를 포함하면 또는 됩니다. 매크로 중 하나를 참조하는 헤더를 포함하면 각 매크로 또는 함수가 하나의 헤더에 속한다는 일반적인 라이브러리 규칙의 예외도 정의됩니다.

이것은 특히 다음과 같은 것을 언급합니다.<stddef.h>C89 위원회에 의해 발명되었습니다.다음과 같은 단어는 찾지 못했습니다.size_t또한 C89 위원회에 의해 발명되었지만, 만약 그렇지 않다면, 그것은 C에서의 꽤 최근의 개발의 성문화였습니다.


bmargulies answer에게 보낸 논평에서 폰브랜드는 '그것은size_t확실히 ANSI-C-ism'입니다.저는 그것이 원래의 ANSI(ISO) C와의 혁신이었다고 매우 쉽게 믿을 수 있지만, 그 근거가 그것을 언급하지 않는 것은 약간 이상합니다.

꼭 그렇다고 할 수는 없죠. 규격은 CISO격≥17.1/2)과다이은을 정의합니다.size_t~하듯이

없는 정수 , 즉 은 의 입니다 입니다 의 은 sizeof입니다

,size_t서될는든의를할수을큼히야다수다야히큼snetsmfeedyoodedh될e수는을든수의할sizeof일 수 (들어 개체의 한 경우) (를 너무 크게 할 수 없도록 ) 클 수 이것은 기계어 크기일 수도 있지만 (예를 들어 컴파일러가 배열 또는 개체의 최대 크기를 제한한 경우) 훨씬 더 작거나 (컴파일러가 개체를 너무 크게 만들어서 하나의 기계어가 개체의 크기를 저장할 수 없게 하는 경우) 훨씬 더 클 수도 있습니다.

도움이 되길 바랍니다!

size_t는 원래 sys/types.h(기존에는 유닉스/리눅스)의 typedef에 불과했습니다.예를 들어 파일의 최대 크기나 malloc의 최대 할당에 대해 '충분히' 큰 것으로 가정했습니다.그러나 시간이 지남에 따라 표준 위원회가 이 파일을 장악하여 여러 헤더 파일에 복사하게 되었고, 매번 다중 정의로부터 자체 #ifdef 보호 기능을 사용하여 보호하게 되었습니다.반면, 잠재적인 파일 크기가 매우 큰 64비트 시스템의 등장으로 역할이 모호해졌습니다.그래서 약간의 팜플렛입니다.

언어 표준은 이제 그것을 stddef.h에 사는 것으로 부릅니다.하드웨어 워드 크기와 필요한 관계가 없고 컴파일러 마법도 없습니다.표준에서 말하는 크기에 대한 다른 답변을 참조하십시오.

이러한 정의는 모두 구현에 정의되어 있습니다.최적의 추측 크기가 필요하다면 (char *)의 크기를 사용하거나 (void *)의 크기를 사용할 것입니다.이것은 소프트웨어가 사용하는 단어의 크기가 명확하다는 것을 가장 잘 알려줍니다.하드웨어가 실제로 가지고 있는 것은 다를 수 있습니다(예를 들어, 32비트 시스템은 소프트웨어에 의해 64비트 정수를 지원할 수 있습니다).

또한 C 언어를 처음 사용하는 경우 정수 크기에 대한 모든 종류의 자료는 stdint.h를 참조하십시오.

비록 정의가 정확히 어떤 유형인지를 직접적으로 언급하지는 않지만size_t가, 그리고 최소 사이즈가 필요하지도 않습니다., 간접적으로 좋은 힌트를 줍니다. A.size_t개체의 크기(바이트 단위)를 포함할 수 있어야 합니다. 즉, 가능한 가장 큰 개체의 크기를 포함할 수 있어야 합니다.

가능한 최대 개체는 사용 가능한 전체 주소 공간과 동일한 크기의 배열(또는 구조)입니다. 큰 개체를 의미 있는 방식으로 참조할 수는 없으며 스왑 공간의 가용성과 별개로 개체가 더 작아져야 할 이유가 없습니다.

그러므로 정의의 문구에 의하여,size_t 32비트 아키텍처에서는 32비트 이상이어야 하며 64비트 시스템에서는 64비트 이상이어야 합니다.물론 구현이 더 큰 것을 선택하는 것은 가능합니다.size_t, 하지만 보통은 그렇지 않습니다.

언급URL : https://stackoverflow.com/questions/14792068/is-size-t-the-word-size

반응형