이 유형으로 정의 된 변수를 볼 수 있지만 그것이 어디에서 왔는지 또는 그 목적이 무엇인지 모릅니다. int 또는 unsigned int를 사용하지 않는 이유는 무엇입니까? (다른 "유사한"유형은 어떻습니까? Void_t 등).
이 유형으로 정의 된 변수를 볼 수 있지만 그것이 어디에서 왔는지 또는 그 목적이 무엇인지 모릅니다. int 또는 unsigned int를 사용하지 않는 이유는 무엇입니까? (다른 "유사한"유형은 어떻습니까? Void_t 등).
답변:
에서 위키 백과
stdlib.h
및stddef.h
헤더 파일이라고하는 데이터 유형을 정의size_t
한 물체의 크기를 나타내는 데 사용된다. 크기를 갖는 라이브러리 함수는 유형이 될 것으로 예상하고size_t
sizeof 연산자는로 평가됩니다size_t
.의 실제 유형
size_t
은 플랫폼에 따라 다릅니다. 일반적인 실수는size_t
unsigned int와 동일 하다고 가정하는 것 입니다.이 경우 프로그래밍 오류가 발생할 수 있습니다. 특히 64 비트 아키텍처가 더욱 널리 퍼짐에 따라 2 번 오류가 발생할 수 있습니다 .
다음 유형과 매크로는 표준 헤더에 정의되어 있습니다.
stddef.h
<스닙>
size_t
이것은 sizeof 연산자 결과의 부호없는 정수 유형입니다.
int
와 unsigned int
size_t와 64 비트 중에 유형 32 비트이다.
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
sizeof 연산자 결과의 부호없는 정수 유형입니다 (ISO C99 섹션 7.17.).
sizeof
연산자 식 또는 유형의 괄호 이름 일 수있다 피연산자의 크기 (바이트)를 산출한다. 크기는 피연산자의 유형에 따라 결정됩니다. 결과는 정수입니다. 결과 값은 구현에 따라 정의되며 유형 (부호없는 정수 유형)은 size_t
(ISO C99 섹션 6.5.3.4.)
실제로 size_t
는 주소를 지정할 수있는 바이트 수를 나타냅니다. 지난 10-15 년 동안 대부분의 최신 아키텍처에서는 부호없는 정수 크기이기도 한 32 비트였습니다. 그러나 우리는 64 비트 주소 지정으로 이동하고 uint
있으며 32 비트로 유지 될 가능성이 가장 높습니다 (C ++ 표준에서는 크기가 보장되지 않음). 메모리 크기에 의존하는 코드를 아키텍처간에 이식 가능하게 만들려면 size_t
. 예를 들어 배열 크기와 같은 것은 항상 size_t
's. 표준 컨테이너를 보면 ::size()
항상 size_t
.
또한 Visual Studio에는 "64 비트 이식성 문제 감지"라는 이러한 유형의 오류를 확인할 수있는 컴파일 옵션이 있습니다.
이렇게하면 특정 유형이 크기 전용이므로 항상 크기를 알 수 있습니다. 이 문제가 될 수 있다는 자신의 질문 쇼 : 그것에게이다 int
또는 unsigned int
? 또한, 크기는 무엇인가 ( short
, int
, long
, 등)?
할당 된 특정 유형이 있기 때문에 길이나 서명 여부에 대해 걱정할 필요가 없습니다.
실제 정의는 C ++ 참조 라이브러리 에서 찾을 수 있습니다 .
유형 :
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가 항상 unsigned int라고 가정하면 (캐스트 등을 통해), 벤더가 size_t를 예를 들어 64 비트 유형으로 변경하면 향후 문제가 발생할 수 있습니다. 이런 이유로 이것 또는 다른 라이브러리 유형에 대해 가정하는 것은 위험합니다.
내가 익숙하지 않다 void_t
Google 검색의 결과를 제외하고 (그에서 사용되는 AT & T 연구소에서 키엠 - 퐁 Vo에 의해 라이브러리 - 나는 그것이 아니라 다른 라이브러리에 사용되는 확신합니다).vmalloc
특정 사항에 사용되는 구체적인 유형이 플랫폼마다 다를 수 있으므로 다양한 xxx_t typedef가 특정 명확한 구현에서 유형을 추상화하는 데 사용됩니다. 예를 들면 :
Void_t
키워드가 존재하지 않을 수 vmalloc
있는 ANSI / ISO C 이전의 시스템에서 작동하도록 작성 되었기 때문에 라이브러리 루틴에 의해 반환 된 포인터 유형을 추상화 void
합니다. 적어도 그것은 내가 추측하는 것입니다.wchar_t
일부 시스템에서는 16 비트 유형이고 다른 시스템에서는 32 비트 유형이므로 와이드 문자에 사용되는 유형을 추상화합니다.따라서 예를 들어 wchar_t
대신 형식 을 사용하도록 와이드 문자 처리 코드를 unsigned short
작성하면 해당 코드가 다양한 플랫폼에 더 쉽게 이식 될 수 있습니다.
"왜 int 또는 unsigned int를 사용하지 않습니까?"에 관해서는 단순히 의미 상 더 의미가 없기 때문입니다. 물론 코드를 변경하지 않아도 typedef
d로 int
업그레이드 한 다음 long
나중에 업그레이드 할 수있는 실용적인 이유가 있습니다 . 대폭 단순화 size_t
하기 위해 유형의 변수는 time_t
시간 값을 포함하는 데 적합한 것과 마찬가지로 사물의 크기를 포함하는 데 적합하고 사용 됩니다. 이것이 실제로 어떻게 구현되는지는 구현의 일입니다. 모든 것을 호출하는 것과 비교할 때 int
이와 같이 의미있는 유형 이름을 사용하면 풍부한 유형 집합이하는 것처럼 프로그램의 의미와 의도를 명확히하는 데 도움이됩니다.