size_t의 정의는 어디에서 찾을 수 있습니까?


123

이 유형으로 정의 된 변수를 볼 수 있지만 그것이 어디에서 왔는지 또는 그 목적이 무엇인지 모릅니다. int 또는 unsigned int를 사용하지 않는 이유는 무엇입니까? (다른 "유사한"유형은 어떻습니까? Void_t 등).



@kjfletch : hhhmmm, 이전에했던 것처럼 'size_t'라는 용어를 검색해도 해당 질문이 반환되지 않는 것이 이상합니다.
Eliseo Ocampos

1
@Eliseo-Stackoverflow의 검색 기능이 끔찍합니다. 대신 'site : stackoverflow.com'매개 변수와 함께 Google을 사용하세요.
Michael Burr

8
OP는 구체적 으로 size_t의 정의를 어디에서 찾을 수 있습니까? 나는 똑같은 것을 찾아 여기에 착륙했다. 인용 된 dup은 선언을 찾을 수있는 위치에 대해 설명하지 않습니다.
jww

9
이 질문은 분명히 연결된 질문과 같은 질문이 아닙니다. "어디에서 무엇을 찾을 수 있습니까?""차이점"과는 다릅니다 (한쪽에 대한 답변이 다른쪽에 대한 답변을 제공하더라도). '이 size_t 정의는 C ++'에 대한 내 Google 검색은 바로 여기에 날 데려 갔어, 그리고 그것을이기 때문에, 다른 질문을 놓친 것 다른 .
Dan Nissenbaum 2016

답변:


122

에서 위키 백과

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

의 실제 유형 size_t은 플랫폼에 따라 다릅니다. 일반적인 실수는 size_tunsigned int와 동일 하다고 가정하는 것 입니다.이 경우 프로그래밍 오류가 발생할 수 있습니다. 특히 64 비트 아키텍처가 더욱 널리 퍼짐에 따라 2 번 오류가 발생할 수 있습니다 .

에서 C99 7.17.1 / 2

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

<스닙>

size_t

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


2
예를 들어,은 Win64에서 intunsigned intsize_t와 64 비트 중에 유형 32 비트이다.
Michael Burr

7
ISO C (99) 표준 (C ++ 표준에 포함됨) 섹션 7.17 및 7.18.3을 참조하십시오
Martin York

3
@LokiAstari 표준에서 작성된 위치를 알고 있기 때문에 답변을 편집하지 않는 이유는 무엇입니까?
Hi-Angel

그렇다면 C ++ 대답은 어디에 있습니까?
Lothar

@Lothar 유일한 차이점은 size_t가 키워드 일 수 있고 그렇지 않으면 동일한 의미를 갖는다는 것입니다.
Paul Stelian 18.03.30

30

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>

2
이것이 내가 필요로 한 것입니다.이 답변은 찬성되어야합니다.
neodelphi

27

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

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


표준을 인용하는 가장 좋은 대답입니다.
Martin York

1
@Martin-충분히 사실이지만 질문의 '왜 서명되지 않은 int 사용되지 않음'부분은 'size_t'부분만큼 흥미 롭다고 생각하며 표준에서 찾을 수 없습니다. .
Michael Burr

예, '섹션 17.17 ' 이 없다는 점을 제외하면 : p. 그것은 드문, 아무도 Void_t에 대해 한 마디 말도하지 않았다
엘리 세오 Ocampos

질문에 직접 응답하므로이 답변을 수락하지만 Michael의 답변으로 칭찬하면 좋을 것입니다.
Eliseo Ocampos

58
귀하의 답변이 포함 할 헤더 파일을 알려주지 않는 것이 유감입니다.
매트

6

실제로 size_t는 주소를 지정할 수있는 바이트 수를 나타냅니다. 지난 10-15 년 동안 대부분의 최신 아키텍처에서는 부호없는 정수 크기이기도 한 32 비트였습니다. 그러나 우리는 64 비트 주소 지정으로 이동하고 uint있으며 32 비트로 유지 될 가능성이 가장 높습니다 (C ++ 표준에서는 크기가 보장되지 않음). 메모리 크기에 의존하는 코드를 아키텍처간에 이식 가능하게 만들려면 size_t. 예를 들어 배열 크기와 같은 것은 항상 size_t's. 표준 컨테이너를 보면 ::size()항상 size_t.

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


2

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

할당 된 특정 유형이 있기 때문에 길이나 서명 여부에 대해 걱정할 필요가 없습니다.

실제 정의는 C ++ 참조 라이브러리 에서 찾을 수 있습니다 .

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

헤더: <cstring>

size_t언어 연산자가 반환 한 정수 데이터 유형 sizeof에 해당하며 <cstring>헤더 파일에서 부호없는 정수 유형으로 정의됩니다.

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

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


2

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


1

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

특정 사항에 사용되는 구체적인 유형이 플랫폼마다 다를 수 있으므로 다양한 xxx_t typedef가 특정 명확한 구현에서 유형을 추상화하는 데 사용됩니다. 예를 들면 :

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

따라서 예를 들어 wchar_t대신 형식 을 사용하도록 와이드 문자 처리 코드를 unsigned short작성하면 해당 코드가 다양한 플랫폼에 더 쉽게 이식 될 수 있습니다.


이것은 부분적으로 제가 찾고 있던 것입니다. 내가 fpmurphy의 대답에 코멘트에 말했듯이,이 (당신은 아마 괜찮다면 당신이 그것을 편집 할 수 있습니다) :이 답변으로 보완 될 수 있다는 좋은 것
엘리 세오 Ocampos

1

size_t정의가 일부 포함에서 "우연히"로드되지 않은 최소한의 프로그램 에서 일부 컨텍스트 (예 : 액세스 std::vector<double>)에서는 여전히 필요합니다 . 그런 다음 해당 컨텍스트를 사용하여 올바른 유형을 추출합니다. 예를 들면 typedef std::vector<double>::size_type size_t.

( namespace {...}필요한 경우 범위를 제한하기 위해 서라운드합니다 .)


1

"왜 int 또는 unsigned int를 사용하지 않습니까?"에 관해서는 단순히 의미 상 더 의미가 없기 때문입니다. 물론 코드를 변경하지 않아도 typedefd로 int업그레이드 한 다음 long나중에 업그레이드 할 수있는 실용적인 이유가 있습니다 . 대폭 단순화 size_t하기 위해 유형의 변수는 time_t시간 값을 포함하는 데 적합한 것과 마찬가지로 사물의 크기를 포함하는 데 적합하고 사용 됩니다. 이것이 실제로 어떻게 구현되는지는 구현의 일입니다. 모든 것을 호출하는 것과 비교할 때 int이와 같이 의미있는 유형 이름을 사용하면 풍부한 유형 집합이하는 것처럼 프로그램의 의미와 의도를 명확히하는 데 도움이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.