서명되지 않은 int vs. size_t
현대 C와 C++ 코드가size_t
대신에int
/unsigned int
C 문자열 기능에 대한 매개 변수에서 STL에 이르기까지 거의 모든 곳에서.나는 이것의 이유와 그것이 가져오는 이득에 대해 궁금하다.
그size_t
type은 의 결과인 서명되지 않은 정수 유형이다.sizeof
연산자(및offsetof
따라서 시스템이 처리할 수 있는 가장 큰 물체의 크기(예: 8Gb의 정적 배열)를 포함할 수 있을 만큼 충분히 커야 한다.
그size_t
유형은 다음보다 크거나 같거나 작을 수 있다.unsigned int
, 그리고 당신의 컴파일러는 최적화를 위해 그것에 대한 가정을 할 수 있다.
더 정확한 정보는 C99 표준, 섹션 7.17에서 찾을 수 있으며, 초안은 인터넷에서 pdf 형식으로 제공되거나, C11 표준 섹션 7.19에서도 pdf 초안으로 제공된다.
요컨대size_t
결코 부정적이지 않으며, 그것은 타겟 플랫폼에서 가능한 가장 큰 물체의 크기를 나타내기에 충분히 크지만 너무 크지는 않은 부호 없는 정수 유형이기 때문에 성능을 극대화한다.
크기는 절대 음수가 되어서는 안 된다.size_t
서명되지 않은 유형.또한, 왜냐하면size_t
부호가 없는 경우, 부호 비트를 사용하여 부호 없는 정수의 다른 모든 비트처럼 크기를 나타낼 수 있기 때문에 부호 비트를 해당 부호 유형보다 약 2배 큰 숫자를 저장할 수 있다.우리가 한 비트를 더 얻었을 때, 우리는 우리가 나타낼 수 있는 숫자의 범위를 약 2의 인수로 곱하고 있다.
그래서, 당신은 묻습니다, 왜 단지unsigned int
그것은 충분히 많은 숫자를 수용할 수 없을지도 모른다.다음과 같은 구현에서unsigned int
32비트로, 가장 큰 숫자는4294967295
IP16L32와 같은 일부 프로세서는 다음보다 큰 개체를 복사할 수 있다.4294967295
바이트 수
그래서, 당신은 묻습니다, "왜?"unsigned long int
일부 플랫폼의 성능 저하표준 C는 다음과 같은 것을 요구한다.long
최소 32비트를 차지하다IP16L32 플랫폼은 각 32비트를 16비트 워드의 쌍으로 구현한다.이러한 플랫폼의 거의 모든 32비트 연산자는 두 개의 16비트 덩어리에 있는 32비트와 함께 작동하기 때문에 그 이상은 아니더라도 두 개의 명령이 필요하다.예를 들어, 32비트 길이를 이동하려면 일반적으로 두 가지 기계 지침이 필요하다. 하나는 각 16비트 청크를 이동하기 위한 것이다.
사용.size_t
이러한 성능의 희생을 피할 수 있다.이 환상적인 기사에 따르면, "타입"size_t
일반적으로 부호 없는 정수 유형의 별칭인 typeef입니다.unsigned int
, 또는unsigned long
, 그러나 아마도 짝수일 것이다.unsigned long long
. 각 표준 C 구현은 목표 플랫폼에서 가능한 가장 큰 물체의 크기를 나타내기 위해 충분히 크지만 필요 이상으로 크지는 않은 부호 없는 정수를 선택하도록 되어 있다."
클래식 C(Brian Kernighan과 Dennis Ritchie가 The C Programming Language, 프렌티스 홀, 1978년)는 제공하지 않았다.size_t
C표준위원회는 소개하였다.size_t
휴대성 문제를 없애다
embedded.com에서 자세히 설명(매우 좋은 예시 포함)
컴파일러가 32비트로 설정되어 있으면size_t
단지 에 대한 타이프일 뿐이다.unsigned int
만약 내 컴파일러가 64비트로 설정되어 있다면size_t
단지 에 대한 타이프일 뿐이다.unsigned long long
.
type size_t는 가능한 객체의 크기를 저장할 수 있을 만큼 커야 한다.서명되지 않은 인트는 그 조건을 만족시킬 필요가 없다.
예를 들어 64비트 시스템 int와 서명되지 않은 int는 32비트 폭일 수 있지만 size_t는 4G보다 큰 숫자를 저장할 수 있을 만큼 커야 한다.
size_t type은 연산자의 크기에서 반환되는 유형이다.호스트 시스템에서 지원되는 메모리 범위의 크기를 바이트 단위로 표현할 수 있는 부호 없는 정수다.ptrdiff_t는 sizeof(ptrdiff_t)와 size of(size_t)와 같은 부호화된 정수 값에서 (일반적으로 ptrdiff_t와 관련된다.
C 코드를 쓸 때는 항상 메모리 범위를 다룰 때마다 size_t를 사용해야 한다.
반면에 int 유형은 기본적으로 호스트 컴퓨터가 정수 산술을 가장 효율적으로 수행하기 위해 사용할 수 있는 (서명된) 정수 값의 크기로 정의된다.예를 들어, 많은 구형 PC형 컴퓨터에서는 값 크기(size_t)가 4(바이트)가 되지만 크기(int)는 2(바이트)가 된다.CPU가 최대 4GiB의 (논리적) 메모리 공간을 처리할 수 있지만 16비트 산술은 32비트 산술보다 빨랐다.
int 유형은 컴파일러 옵션과 머신 아키텍처에 따라 실제 정밀도가 크게 달라지기 때문에 효율성에 관심이 있는 경우에만 사용하십시오.특히 C 표준은 다음과 같은 불변수를 명시한다: 크기(char) <= 크기(shize of(short)> <= 크기(int) <= 크기(long)>는 이러한 원시 유형 각각에 대해 프로그래머가 사용할 수 있는 정밀도의 실제 표현에 다른 제한을 두지 않는다.
참고: 이는 Java에서와 같지 않다(실제로 'char', 'byte', 'short', 'int', 'long'의 각 유형에 대한 비트 정밀도를 지정).
glibc 매뉴얼 0.02에서 발췌한 이 내용은 다음 주제를 조사할 때도 관련이 있을 수 있다.
2.4 릴리즈 전 GCC의 size_t 유형과 버전에 잠재적인 문제가 있다.ANSI C는 항상 서명되지 않은 유형인 size_t를 요구한다.기존 시스템의 헤더 파일과의 호환성을 위해 GCC는 size_t를 정의한다.stddef.h' to be whatever type the system's
sys/propertiesh'는 그렇게 규정한다.size_t를 'sys/type.h'로 정의하는 대부분의 Unix 시스템은 size_t를 서명된 형식으로 정의한다.라이브러리의 일부 코드는 크기_t가 서명되지 않은 유형인지에 따라 달라지며, 서명된 경우 올바르게 작동하지 않는다.
size_t가 서명되지 않은 것으로 예상되는 GNU C 라이브러리 코드는 정확하다.size_t의 signed type 정의가 잘못되었다.우리는 버전 2.4에서 GCC가 항상 size_t를 서명되지 않은 유형으로 정의하고,fixincludes' script will massage the system's
sys/properties이것과 충돌하지 않기 위해서.
그동안 우리는 GNU C 라이브러리를 컴파일할 때 GCC에 size_t에 대해 서명되지 않은 유형을 사용하도록 명시적으로 지시함으로써 이 문제를 해결한다.'configure'는 GCC가 size에 사용하는 유형을 자동으로 감지하며 필요 시 이를 재정의하도록 배열한다.
size_t는 포인터 크기 입니다.
따라서 32비트 또는 공통 ILP32(integer, long, pointer) 모델 size_t는 32비트 입니다.그리고 64비트 또는 공통 LP64(긴 길이, 포인터) 모델 size_t는 64비트(정수는 여전히 32비트)이다.
다른 모델도 있지만 g++가 사용하는 모델(최소한 기본적으로)
참조URL: https://stackoverflow.com/questions/131803/unsigned-int-vs-size-t
'IT이야기' 카테고리의 다른 글
포맷된 IO 함수(*printf / *scanf)에서 변환 지정자 %i와 %d의 차이점 (0) | 2022.05.09 |
---|---|
공리 오류를 전체적으로 또는 한 지점에서 관리하는 방법 (0) | 2022.05.09 |
vue의 하위 구성 요소에서 키 액세스 (0) | 2022.05.09 |
복잡한 개체에 대한 Vuex 모범 사례 (0) | 2022.05.09 |
상위에서 VUE 구성 요소 데이터 입력 지우기 (0) | 2022.05.09 |