size_t의 정의는 어디에 있습니까? [복제]
이 질문에는 이미 답변이 있습니다.
이 유형으로 정의 된 변수를 볼 수 있지만 변수의 출처와 목적을 알 수 없습니다. 왜 int 또는 unsigned int를 사용하지 않습니까? (다른 "유사한"유형은 어떻습니까? Void_t 등).
에서 위키 백과
stdlib.h
및stddef.h
헤더 파일이라고하는 데이터 유형을 정의size_t
한 물체의 크기를 나타내는 데 사용된다. 크기를 취하는 라이브러리 함수는 형식이 될 것으로 예상하고size_t
sizeof 연산자는 다음과 같이 평가됩니다size_t
.실제 유형
size_t
은 플랫폼에 따라 다릅니다. 일반적인 실수가 가정하는 것은size_t
프로그래밍 오류가 발생할 수 있습니다 부호없는 INT,과 동일, 2는 64 비트 아키텍처는 더 널리되고 특히있다.
표준 헤더에는 다음과 같은 유형과 매크로가 정의되어 있습니다.
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 비트 주소 지정으로 이동하는 반면 uint
32 비트로 유지 될 가능성이 높습니다 (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
,strncpy
와strxfrm
, 모든 경우에 바이트 또는 기능에 영향을 가지고 문자의 최대 수를 지정하는 데 사용됩니다.또한 대한 반환 형식으로 사용됩니다
strcspn
,strlen
,strspn
그리고strxfrm
반환 크기와 길이에.
size_t는 표준 라이브러리 헤더에 정의해야합니다. 내 경험상, 그것은 일반적으로 unsigned int에 대한 typedef입니다. 그러나 요점은 반드시 그럴 필요는 없다는 것입니다. size_t와 같은 유형을 사용하면 표준 라이브러리 공급 업체가 플랫폼에 적합한 경우 기본 데이터 유형을 자유롭게 변경할 수 있습니다. size_t가 항상 서명되지 않은 int (캐스팅 등을 통해)라고 가정하면 공급 업체가 size_t를 64 비트 유형으로 변경하면 나중에 문제가 발생할 수 있습니다. 이런 이유로이 라이브러리 또는 다른 라이브러리 유형에 대해 가정하는 것은 위험합니다.
내가 익숙하지 않다 void_t
Google 검색의 결과를 제외하고 (그에서 사용되는 AT & T 연구소에서 키엠 - 퐁 Vo에 의해 라이브러리 - 나는 그것이 아니라 다른 라이브러리에 사용되는 확신합니다).vmalloc
다양한 xxx_t typedef는 특정 명확한 구현에서 유형을 추상화하는 데 사용됩니다. 특정 사물에 사용되는 구체적인 유형은 플랫폼마다 다를 수 있습니다. 예를 들면 다음과 같습니다.
- size_t는 일부 시스템에서는 이것이 32 비트 값이고 다른 시스템에서는 16 비트 또는 64 비트 일 수 있기 때문에 객체의 크기를 유지하는 데 사용되는 유형을 추상화합니다.
Void_t
키워드가 존재하지 않는vmalloc
ANSI / 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, typedef
d 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
'Programming' 카테고리의 다른 글
Eclipse에서 프로젝트를 그룹화 할 수 있습니까? (0) | 2020.07.27 |
---|---|
문자열 값 앞의 'u'기호는 무엇을 의미합니까? (0) | 2020.07.27 |
LINQ 기능의 순서는 중요합니까? (0) | 2020.07.27 |
Java 파일에 jar 파일을 포함시키고 명령 프롬프트에서 컴파일하는 방법 (0) | 2020.07.27 |
멤버 생성자 및 소멸자 호출 순서 (0) | 2020.07.27 |