문제

몇 가지 C ++ 예제에서 나는 간단한 int를 사용했던 유형 size_t를 사용하는 것을 볼 수 있습니다. 차이점은 무엇이며 Size_t가 더 나은 이유는 무엇입니까?

도움이 되었습니까?

해결책

에서 친절한 위키 백과:

stdlib.h 및 stddef.h 헤더 파일은 size_t 객체의 크기를 나타내는 데 사용됩니다. 크기를 취하는 라이브러리 기능은 유형 크기 _t이며 연산자의 크기는 size_t로 평가됩니다.

실제 size_t의 실제 유형은 플랫폼 의존적입니다. 일반적인 실수는 size_t가 서명되지 않은 INT와 동일하다고 가정하는 것입니다. 이는 특히 64 비트 아키텍처가 더 널리 퍼져 있기 때문에 프로그래밍 오류로 이어질 수 있습니다.

또한 확인하십시오 Size_t가 중요한 이유

다른 팁

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

INT는 기본적으로 서명되며 크기는 플랫폼 의존적이지만 대부분의 최신 기계에서 고정 된 32BITS (64 비트 아키텍처에서 64 비트이지만 INT는 해당 아키텍처에서 32 비트를 유지합니다).

요약하려면 : size_t를 사용하여 다른 경우 객체와 int (또는 Long)의 크기를 나타냅니다.

size_t는 int (아마도 구조물) 이외의 것이 될 수 있기 때문입니다. 아이디어는 그것이 기본 유형에서 일하는 것입니다.

그만큼 size_t 유형은 서명되지 않은 적분 유형으로 정의됩니다. sizeof 운영자. 현실 세계에서는 종종 볼 수 있습니다 int 32 비트 (후진 호환성)로 정의되었지만 size_t 64 비트 플랫폼에서 64 비트 (크기가 4 개 이상의 gib 이상의 gib를 선언 할 수 있음)로 정의됩니다. 만약 long int 또한 64 비트이며, 이것을 LP64 컨벤션이라고합니다. 만약에 long int 32 비트이지만 long long int 포인터는 64 비트, 즉 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, 음수를 얻을 가능성도 있습니다. 만약 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.aspx 그리고 https://msdn.microsoft.com/en-us/library/cc230394.aspx

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

SIZE_T a ULONG_PTR 포인터가 가리킬 수있는 최대 바이트 수를 나타냅니다.

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

typedef ULONG_PTR SIZE_T;

ULONG_PTR 포인터 정밀도에 사용되는 서명되지 않은 긴 유형입니다. 포인터 산술을 수행하기 위해 긴 유형으로 포인터를 캐스팅 할 때 사용됩니다.

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

typedef unsigned __int3264 ULONG_PTR;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top