C ++에서 size_t와 int의 차이점은 무엇입니까?


답변:


153

에서 친절한 위키 백과 :

stdlib.h 및 stddef.h 헤더 파일 은 객체의 크기를 나타내는 데 사용되는 size_t 라는 데이터 유형을 정의 합니다. 크기를 취하는 라이브러리 함수는 크기가 size_t 인 것으로 예상하고 sizeof 연산자는 size_t로 평가됩니다.

size_t의 실제 유형은 플랫폼에 따라 다릅니다. 일반적인 실수는 size_t가 부호없는 int와 같다고 가정하는 것인데, 이는 특히 64 비트 아키텍처가 널리 보급됨에 따라 프로그래밍 오류로 이어질 수 있습니다.

또한 size_t가 중요한 이유를 확인하십시오.


76
그래서 size_t는 무엇입니까?
NDEthos

8
@ NDEthos 그것은 달려있다! 여기에서 Linux /usr/include/stdlib.h는 정의를 가져오고 다른 헤더 파일에서 달리 언급하지 않는 한 /usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h기본값으로 설정 long unsigned int됩니다.
David Tonhofer 2016 년

1
int 조정이 size_t 위험하다는 것을 확인 합니다. 이것은 주제에 맞지 않을 수도 있지만 리눅스 커널에서 수천 번 발생할 때 이런 종류의 실수를 해결하기 위해 패치를 작성하는 방법은 무엇입니까?
user2284570

36

size_t는 크기를 나타내는 데 사용되는 유형입니다 (이름에서 알 수 있듯이). 플랫폼 (및 잠재적으로 구현 가능)에 따라 달라지며이 목적으로 만 사용해야합니다. 분명히, 크기를 나타내는 size_t는 부호가 없습니다. malloc, sizeof 및 다양한 문자열 연산 함수를 포함한 많은 stdlib 함수는 size_t를 데이터 유형으로 사용합니다.

int는 기본적으로 서명되며 크기도 플랫폼에 따라 다르지만 대부분의 최신 컴퓨터에서 고정 된 32 비트가됩니다 (64_s 아키텍처에서는 size_t가 64 비트이지만 int는 32 비트로 유지됩니다).

요약 : size_t를 사용하여 객체의 크기를 나타내고 다른 경우에는 int (또는 long)를 나타냅니다.


12

size_t유형의 부호없는 정수 형태로 정의 sizeof연산자. 실제로는 64 비트 플랫폼에서 int32 비트 (역 호환성을 위해)로 size_t정의되었지만 64 비트 (4 GiB보다 큰 배열 및 구조를 선언 할 수 있음 )로 정의되는 경우가 종종 있습니다. a long int가 64 비트 인 경우이를 LP64 규칙이라고합니다. 경우에는 long int32 비트로되지만, long long int및 포인터를 LLP64의 64 비트이다. 속도를 위해 64 비트 명령어를 사용하지만 메모리를 절약하기 위해 32 비트 포인터를 사용하는 프로그램 인 리버스도 얻을 수 있습니다. 또한 int서명되고 size_t서명되지 않습니다.

역사적으로 주소가의 기본 크기보다 넓거나 짧은 다른 플랫폼도있었습니다 int. 실제로, 70 년대와 80 년대 초에는 이것이 일반적이지 않았습니다. 모든 인기있는 8 비트 마이크로 컴퓨터는 8 비트 레지스터와 16 비트 주소를 가졌으며 16 비트와 32 비트 사이의 전환은 많은 기계를 생산했습니다. 자신의 레지스터보다 주소가 더 넓습니다. MS-DOS 용 Borland Turbo C에 대한 질문은 여전히 ​​그렇습니다. 거대한 메모리 모드에는 16 비트 CPU에서 32 비트로 저장된 20 비트 주소가 있지만 80386의 32 비트 명령어 세트를 지원할 수 있습니다. Motorola 68000에는 32 비트 레지스터와 주소가있는 16 비트 ALU가 있습니다. 15 비트, 24 비트 또는 31 비트 주소를 가진 IBM 메인 프레임이있었습니다. 또한 임베디드 시스템에서 다른 ALU 및 주소 버스 크기를 볼 수 있습니다.

시간 int이보다 작고 size_t에 매우 큰 파일 또는 객체의 크기 또는 오프셋을 저장하려고하면 unsigned int오버플로가 발생하여 버그가 발생할 수 있습니다. 를 사용하면 int음수를 얻을 가능성도 있습니다. 는 IF int또는 unsigned int넓은 프로그램이 제대로 실행되지만 메모리를 낭비 할 것이다.

이식성을 원하는 경우 일반적으로 목적에 맞는 올바른 유형을 사용해야합니다. 많은 사람들이 부호없는 수학 대신 부호없는 수학을 사용하도록 권장합니다 (불쾌하고 미묘한 버그를 피하기 위해 1U < -3). 그 목적을 위해, 표준 라이브러리를 정의 ptrdiff_t에서 <stddef.h>서로에 대한 포인터를 뺀 결과의 서명 유형으로.

즉에 대한 모든 주소와 오프셋을 경계 체크에 해결 될 수 말했다 INT_MAX및 하나 0또는 INT_MIN적절하게, 그리고 당신이 하나를 놓칠 경우 컴파일러 서명을 비교에 대한 경고 및 서명되지 않은 수량을 켭니다. 어쨌든 항상 C에서 오버플로에 대한 배열 액세스를 항상 확인해야합니다.


8

size_t는 int (구조 일 수도 있음) 이외의 것이 될 수 있기 때문입니다. 아이디어는 기본 유형에서 작업을 분리한다는 것입니다.


8
size_t는 실제로 부호없는 정수의 별칭이라고 보장되므로 구조가 될 수 없습니다. 그래도 지금 이것을 백업하기에 편리한 참조 자료는 없습니다.
언 와인드

9
@unwind : C99 : TC3, 7.17 §2
Christoph

1
@danio 왜 그렇게 설명 할 수 있습니까?
Rüppell 's Vulture

2
내가 당신이라면 나는 cplusplus에 연결되지 않을 것입니다! 챕터, 구절, 단락 및 줄을 인용 할 수 없다면 그것은 모두 단지 소문입니다! :-)
graham.reeds

1
size_t부호없는 정수 유형 으로 지정됩니다 . C11 §6.5.3.4 5 "두 연산자 ( sizeof _Alignof) 의 결과 값 은 구현에 따라 정의되며 해당 유형 (부호없는 정수 유형)은입니다 size_t."
chux-복원 Monica Monica

-1

의 정의는 SIZE_T:에서 발견 https://msdn.microsoft.com/en-us/library/cc441980.aspxhttps://msdn.microsoft.com/en-us/library/cc230394.aspx

필요한 정보를 여기에 붙여 넣기 :

SIZE_TA는 ULONG_PTR포인터가 가리킬 수있는 최대 바이트 수를 나타내는이.

이 유형은 다음과 같이 선언됩니다.

typedef ULONG_PTR SIZE_T;

A ULONG_PTR는 포인터 정밀도에 사용되는 부호없는 long 유형입니다. 포인터 산술을 수행하기 위해 포인터를 긴 유형으로 캐스트 할 때 사용됩니다.

이 유형은 다음과 같이 선언됩니다.

typedef unsigned __int3264 ULONG_PTR;

2
SIZE_Tsize_t, OP가 요청한 내용 이 아닙니다 .
ikegami

2
그것은 표준 언어의 일부가 아닌 Microsoft 확장입니다.
Davislor

SIZE_T와는 완전히 다릅니다 size_t. 유형의 변수를 선언 할 수 없습니다 SIZE_T.
calocedrus 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.