Programing

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

crosscheck 2020. 6. 9. 08:09
반응형

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


여러 C ++ 예제 size_t에서 간단한 사용했을 때 사용하는 유형을 볼 수 있습니다 int. 차이점은 무엇이며 왜 size_t더 좋아야합니까?


에서 친절한 위키 백과 :

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

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

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


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

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

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


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


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에서 오버플로에 대한 배열 액세스를 항상 확인해야합니다.


의 정의는 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;

참고 URL : https://stackoverflow.com/questions/502856/whats-the-difference-between-size-t-and-int-in-c

반응형