Programming

size_t의 정의는 어디에 있습니까?

procodes 2020. 7. 27. 21:33
반응형

size_t의 정의는 어디에 있습니까? [복제]


이 질문에는 이미 답변이 있습니다.

이 유형으로 정의 된 변수를 볼 수 있지만 변수의 출처와 목적을 알 수 없습니다. 왜 int 또는 unsigned int를 사용하지 않습니까? (다른 "유사한"유형은 어떻습니까? Void_t 등).


에서 위키 백과

stdlib.hstddef.h헤더 파일이라고하는 데이터 유형을 정의 size_t 물체의 크기를 나타내는 데 사용된다. 크기를 취하는 라이브러리 함수는 형식이 될 것으로 예상하고 size_tsizeof 연산자는 다음과 같이 평가됩니다 size_t.

실제 유형 size_t은 플랫폼에 따라 다릅니다. 일반적인 실수가 가정하는 것은 size_t프로그래밍 오류가 발생할 수 있습니다 부호없는 INT,과 동일, 2는 64 비트 아키텍처는 더 널리되고 특히있다.

에서 C99 7.17.1 / 2

표준 헤더에는 다음과 같은 유형과 매크로가 정의되어 있습니다. stddef.h

<스닙>

size_t

sizeof 연산자 결과의 부호없는 정수 유형입니다.


size_t sizeof 연산자 결과의 부호없는 정수 유형입니다 (ISO C99 섹션 7.17).

sizeof연산자 식 또는 유형의 괄호 이름 일 수있다 피연산자의 크기 (바이트)를 산출한다. 크기는 피연산자의 유형에 따라 결정됩니다. 결과는 정수입니다. 결과의 값은 구현에 따라 정의되며 그 유형 (부호없는 정수 유형)은 size_t(ISO C99 Section 6.5.3.4)입니다.


en.cppreference.com에 대한 size_t 설명에 따르면 size_t다음 헤더에 정의되어 있습니다.

std::size_t

...    

Defined in header <cstddef>         
Defined in header <cstdio>      
Defined in header <cstring>         
Defined in header <ctime>       
Defined in header <cwchar>

실제로 말하면 size_t주소를 지정할 수있는 바이트 수를 나타냅니다. 지난 10-15 년 동안 대부분의 현대 건축에서 32 비트는 부호없는 int의 크기였습니다. 그러나 우리는 64 비트 주소 지정으로 이동하는 반면 uint32 비트로 유지 될 가능성이 높습니다 (c ++ 표준에서는 크기가 보장되지 않습니다). 메모리 크기에 의존하는 코드를 여러 아키텍처에서 이식 가능하게하려면을 사용해야합니다 size_t. 예를 들어 배열 크기와 같은 것은 항상를 사용해야합니다 size_t. 표준 컨테이너를 보면 ::size()항상 a를 반환합니다 size_t.

또한 Visual Studio에는 "64 비트 이식성 문제 감지"라는 이러한 유형의 오류를 확인할 수있는 컴파일 옵션이 있습니다.


이 방법을 사용하면 특정 유형이 크기 전용이므로 크기가 무엇인지 항상 알 수 있습니다. 이 문제가 될 수 있다는 자신의 질문 쇼 : 그것에게이다 int또는 unsigned int? 또한, 크기는 무엇인가 ( short, int, long, 등)?

지정된 특정 유형이 있으므로 길이나 부호에 대해 걱정할 필요가 없습니다.

실제 정의는 C ++ Reference Library 에서 찾을 수 있습니다 .

유형 : size_t(부호없는 정수 유형)

헤더: <cstring>

size_t은 언어 연산자가 반환 한 정수 데이터 형식 sizeof에 해당하며 <cstring>헤더 파일에 서명되지 않은 정수 형식으로 정의됩니다.

에서 <cstring>,이 매개 변수의 유형으로 사용되는 num기능에 memchr, memcmp, memcpy, memmove, memset, strncat, strncmp, strncpystrxfrm, 모든 경우에 바이트 또는 기능에 영향을 가지고 문자의 최대 수를 지정하는 데 사용됩니다.

또한 대한 반환 형식으로 사용됩니다 strcspn, strlen, strspn그리고 strxfrm반환 크기와 길이에.


size_t는 표준 라이브러리 헤더에 정의해야합니다. 내 경험상, 그것은 일반적으로 unsigned int에 대한 typedef입니다. 그러나 요점은 반드시 그럴 필요는 없다는 것입니다. size_t와 같은 유형을 사용하면 표준 라이브러리 공급 업체가 플랫폼에 적합한 경우 기본 데이터 유형을 자유롭게 변경할 수 있습니다. size_t가 항상 서명되지 않은 int (캐스팅 등을 통해)라고 가정하면 공급 업체가 size_t를 64 비트 유형으로 변경하면 나중에 문제가 발생할 수 있습니다. 이런 이유로이 라이브러리 또는 다른 라이브러리 유형에 대해 가정하는 것은 위험합니다.


내가 익숙하지 않다 void_tGoogle 검색의 결과를 제외하고 (그에서 사용되는 AT & T 연구소에서 키엠 - 퐁 Vo에 의해 라이브러리 - 나는 그것이 아니라 다른 라이브러리에 사용되는 확신합니다).vmalloc

다양한 xxx_t typedef는 특정 명확한 구현에서 유형을 추상화하는 데 사용됩니다. 특정 사물에 사용되는 구체적인 유형은 플랫폼마다 다를 수 있습니다. 예를 들면 다음과 같습니다.

  • size_t는 일부 시스템에서는 이것이 32 비트 값이고 다른 시스템에서는 16 비트 또는 64 비트 일 수 있기 때문에 객체의 크기를 유지하는 데 사용되는 유형을 추상화합니다.
  • Void_t키워드가 존재하지 않는 vmallocANSI / ISO C 이전의 시스템에서 작동하도록 작성 되었기 때문에 라이브러리 루틴이 리턴 한 포인터 유형을 추상화 void합니다. 적어도 그것은 내가 추측 할 것입니다.
  • wchar_t 일부 시스템에서는 16 비트 유형이고 다른 시스템에서는 32 비트 유형이기 때문에 와이드 문자에 사용되는 유형을 추상화합니다.

So if you write your wide character handling code to use the wchar_t type instead of, say unsigned short, that code will presumably be more portable to various platforms.


In minimalistic programs where a size_t definition was not loaded "by chance" in some include but I still need it in some context (for example to access std::vector<double>), then I use that context to extract the correct type. For example typedef std::vector<double>::size_type size_t.

(Surround with namespace {...} if necessary to make the scope limited.)


As for "Why not use int or unsigned int?", simply because it's semantically more meaningful not to. There's the practical reason that it can be, say, typedefd as an int and then upgraded to a long later, without anyone having to change their code, of course, but more fundamentally than that a type is supposed to be meaningful. To vastly simplify, a variable of type size_t is suitable for, and used for, containing the sizes of things, just like time_t is suitable for containing time values. How these are actually implemented should quite properly be the implementation's job. Compared to just calling everything int, using meaningful typenames like this helps clarify the meaning and intent of your program, just like any rich set of types does.

참고URL : https://stackoverflow.com/questions/1119370/where-do-i-find-the-definition-of-size-t

반응형