"int"와 "int_fast16_t"의 차이점은 무엇입니까?
제가 이해한 바로는, C사양은 그 타입으로 되어 있습니다.int최소 16비트를 포함하는 대상 플랫폼에서 가장 효율적인 유형이어야 합니다.
그것이 바로 C99의 정의가 아닌가요?int_fast16_t너무?
요, 는 아도그넣위거것해이기, 하다나는른다었을에마관을성일지들단은그것을▁the▁maybe▁other▁consist하▁inency▁it▁just▁since▁they나▁for▁put는,다▁there른.int_fastXX_t필요합니까?
갱신하다
아래에서 논의를 요약합니다.
- 제 질문은 여러 면에서 틀렸습니다.C 표준은 int에 대한 비트를 지정하지 않습니다.포함해야 하는 범위 [-32767,32767]를 제공합니다.
- 저는 처음에 대부분의 사람들이 "하지만 그 범위는 적어도 16비트를 의미합니다!"라고 말할 것이라는 것을 깨달았습니다.그러나 C는 정수를 두 개의 상보 저장할 필요가 없습니다."16비트"라고 말했다면 1비트 패리티, 1비트 부호 및 14비트 크기를 가진 플랫폼이 여전히 "표준을 충족"하지만 해당 범위를 충족하지 못하는 경우가 있을 수 있습니다.
- 표준은 int가 가장 효율적인 유형이라는 것에 대해 아무 것도 말하지 않습니다.위의 크기 요구 사항 외에도, int는 컴파일러 개발자가 가장 중요하다고 생각하는 기준에 따라 결정할 수 있습니다.(속도, 크기, 이전 버전과의 호환성 등)
- 반면 int_fast16_t는 컴파일러에게 성능에 최적인 유형을 사용해야 한다는 힌트를 제공하는 것과 같습니다.
- 마찬가지로 int_limest16_t는 컴파일러에게 >= 16비트의 가장 작은 유형을 사용하도록 지시합니다.대형 어레이 등에서 공간을 보존하는 데 적합합니다.
예: x86-64의 MSVC는 64비트 시스템에서도 32비트 int를 지원합니다. MS는 너무 많은 사람들이 int가 항상 정확하게 32비트일 것이라고 가정했기 때문에 이를 선택했습니다. 따라서 많은 ABI가 손상될 것입니다.그러나 x86-64에서 64비트 값이 더 빠르다면 int_fast32_t가 64비트 숫자가 될 수 있습니다. (실제로는 그렇지 않다고 생각하지만 요점을 보여줍니다.)
int는 속도/크기에서 "가장 효율적인 유형"이지만 C 사양에 따라 에 의해 지정되지는 않습니다.16비트 이상이어야 합니다.
int_fast16_t최소 16비트 int 범위에서 속도가 가장 효율적인 유형입니다.
은 ": 주진플은다음같과이결수정있다할습니예랫폼어▁may▁that다있니▁have▁example습수▁decided예:▁a:"로 결정했을 수 있습니다.int속도뿐만 아니라 여러 가지 이유로 32비트여야 합니다.동일한 시스템에서 16비트 정수에 대해 다른 유형이 가장 빠르다는 것을 발견할 수 있습니다.
설정:64비트 시스템의 경우, 사용자는 다음과 같은 작업을 수행할 수 있습니다.int64비트로서, 컴파일러는 32비트 모드를 사용할 수 있습니다.int호환성을 위한 컴파일이 모드에서는,int_fast16_t정렬 문제 등을 방지하기 위해 기본적으로 가장 빠른 너비인 64비트일 수 있습니다.
int_fast16_t최소 16비트의 크기로 가장 빠른 int가 보장됩니다. int다음을 제외하고는 크기에 대한 보장이 없습니다.
sizeof(char) = 1 and sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long).
-32767에서 +32767까지의 범위를 유지할 수 있습니다.
"(7.20.1.3p2)" "형식 정의명
int_fastN_t너비가 N 이상인 가장 빠른 부호 있는 정수 유형을 지정합니다.형식 정의 이름uint_fastN_t너비가 N 이상인 가장 빠른 부호 없는 정수 유형을 지정합니다."
제가 이해한 바로는, C사양은 그 타입으로 되어 있습니다.
int최소 16비트를 포함하는 대상 플랫폼에서 가장 효율적인 유형이어야 합니다.
다음은 이 표준이 실제로 말하는 것입니다.int(N1570 초안, 섹션 6.2.5, 제5항):
"일반" 개체는 실행 환경의 아키텍처에서 제안하는 자연 크기를 가집니다(헤더에 정의된 ~ 범위의 값을 포함할 수 있을 정도로 충분히 큼).
참조한에 대한 .INT_MIN그리고.INT_MAX는 약간를 불러일으킬 수 . 됩니다. 이러한 값은 유형의 특성에 따라 선택됩니다.int다른 길이 아니다.
그리고 "자연적인 크기"라는 문구도 약간 오해의 소지가 있습니다.대상 아키텍처에 따라 정수 유형에 대해 하나의 "자연" 크기만 존재하지 않을 수 있습니다.
다른 곳에서는 표준에 따르면INT_MIN 기해까지여야 .-32767,그리고.INT_MAX적어도 다음 값이어야 합니다.+32767그것은 의미합니다.int최소 16비트입니다.
에따면다같다습니음과르준표▁says▁the다▁about▁here같▁standard니습에 대한 것입니다.int_fast16_t(7.20.1.3):
다음 각 유형은 적어도 지정된 너비를 가진 모든 정수 유형 중 일반적으로 가장 빠르게 작동하는 정수 유형을 지정합니다.
각주 포함:
지정된 유형이 모든 목적에서 가장 빠르다는 보장은 없습니다. 구현에 다른 유형보다 한 유형을 선택할 수 있는 명확한 근거가 없는 경우 서명 및 너비 요구 사항을 충족하는 정수 유형을 선택하기만 하면 됩니다.
요건int그리고.int_fast16_t비슷하지만 동일하지는 않습니다. 마찬가지로 모호합니다.
실로제, 는크기의 입니다.int종종 "자연 크기"가 아닌 다른 기준에 따라 선택됩니다. 즉, 편의를 위해 해당 구문이 해석됩니다. 종종의크의 크기int코드 이식의 어려움을 최소화하기 위해 새 아키텍처가 기존 아키텍처의 크기와 일치하도록 선택되었습니다.그리고 여기엔 꽤나 강력한 동기부여가 있습니다.int, 32비트, 32비트 유형으로 합니다.char,short,그리고.int8, 16 및 32비트의 크기를 포함할 수 있습니다. 특히 입니다. 의 C 컴파일러는 64비트, x86-64 파일 "파일럿"을 만듭니다.int는 64비트를 도 함)long단 32비트).
대기 선유 택형에 int_fast16_t그것을 사용하는 모든 코드는 16비트 부호 정수형을 명시적으로 요구하기 때문에, 나는 그것에 덜 의존적이라고 생각합니다.이 은많기코다특음의합대의 에 가정을 .int표준이 보장하는 것을 넘어서 컴파일러 개발자가 컴파일러를 사용하려면 이러한 코드를 충족해야 합니다.
다른 점은 효율성/최적화를 위해 빠른 유형이 빠른 속도 없이 다른 유형보다 넓어질 수 있다는 것입니다.그러나 C 표준은 결코 그들이 실제로 더 빠르다고 보장하지 않습니다.
C11, 7.20.1.3 가장 빠른 최소 폭 정수 유형
1 다음 각 유형은 지정된 너비 이상의 모든 정수 유형 중에서 일반적으로 가장 빠른 262)의 정수 유형을 지정합니다.
2 typedefname int_fastN_t는 너비가 N 이상인 가장 빠른 서명 정수 유형을 지정합니다.typedefault name uint_fastN_t는 너비가 N 이상인 가장 빠른 부호 없는 정수 유형을 지정합니다.
262) 지정된 유형이 모든 목적에서 가장 빠르다는 보장은 없습니다. 구현이 다른 유형보다 한 유형을 선택할 수 있는 명확한 근거가 없는 경우, 서명 및 너비 요구 사항을 충족하는 정수 유형을 선택하기만 하면 됩니다.
또 다른 차이점은 빠른 유형과 최소 유형은 필수 유형인 반면 다른 정확한 폭 유형은 선택적이라는 것입니다.
3 다음 유형이 필요합니다. int_fast8_tint_fast16_tint_fast32_fast64_tint_tuint_fast8_tuint_fast16_tuint32_fast64_t 이 양식의 다른 모든 유형은 선택 사항입니다.
에서 C99는7.8 정수 형식 변환(표준과 함께 제공되는 문서), 강조 마이:
는 이 가 네 된 정수 데이터 유형과 정수 데이터합니다.
char,short,int그리고.long그러나 크기에 대한 요구 사항은 그 외에는 거의 없으며 최소 16비트 이상이며 최소 32비트 이상이어야 합니다.16비트 시스템의 경우 대부분의 구현은 8, 16, 16 및 32비트를 다음에 할당합니다.char,short,int,그리고.long각각 다음과 같다.32비트 시스템의 경우 이러한 유형에 8, 16, 32 및 32비트를 할당하는 것이 일반적입니다. 차이는 이차는.int표준 C의 정수 승격 규칙은 예기치 않게 자동 변경을 발생시킬 수 있기 때문에 크기는 정수 유형에 다른 크기를 할당하는 시스템 간에 마이그레이션하는 사용자에게 몇 가지 문제를 일으킬 수 있습니다.64비트 시스템의 도입으로 확장 정수 유형을 정의해야 할 필요성이 증가했습니다.의 은?
<inttypes.h>는 컴퓨터 간에 일관성이 있고 운영 체제 및 기타 구현 특성과 무관한 정수 유형 집합을 제공합니다.를 정의합니다.typedef다양한 크기의 정수 유형구현은 무료입니다.typedef이들이 지원하는 표준 C 정수 유형 또는 확장자로 지정됩니다.이 헤더를 일관되게 사용하면 플랫폼 간에 사용자 프로그램의 이식성이 크게 향상됩니다.
의 주요 int그리고.int_fast16_t후자가 이러한 "번역 특이점"으로부터 자유로울 가능성이 높다는 것입니다.다음과 같이 생각할 수 있습니다.
는 현의구 OS/현정 "치에는"의 현재 구현 "이 없습니다.int16비트 이상의 가장 빠른 서명 정수형이 무엇이든 주세요.
일부 플랫폼에서는 16비트 값을 사용하는 것이 32비트 값을 사용하는 것보다 훨씬 느릴 수 있습니다(예: 8비트 또는 16비트 저장소에서는 32비트 로드를 수행하고 로드된 값을 수정하고 결과를 다시 기록해야 합니다).캐시에 32비트 값(16비트 값이 32비트 시스템의 32비트 값보다 더 빠른 일반적인 상황)보다 2배 더 많은 16비트 값을 넣을 수 있다고 해도, 모든 쓰기 앞에 읽기를 추가해야 하는 필요성은 데이터 구조를 쓰기보다 훨씬 자주 읽지 않는 한 속도 이점을 상쇄할 수 있습니다.이러한 플랫폼에서는 다음과 같은 유형이 있습니다.int_fast16_t32비트일 가능성이 높습니다.
표준불컴게에즉, .int_fast16_t주소가 편리한 것에 따라 16비트 유형 또는 더 큰 유형으로 임의로 동작하지 않습니다.예를 들어 다음 방법을 고려합니다.
int32_t blah(int32_t x)
{
int_fast16_t y = x;
return y;
}
많은 플랫폼에서 메모리에 저장된 16비트 정수는 레지스터에 저장된 정수와 마찬가지로 조작할 수 있지만 레지스터에 16비트 연산을 수행하라는 지침은 없습니다.만약에int_fast16_t ~ 할 수 , 은 메변모저수있수며만 -32768 ~ +32767유으지할동, 적다니됩용이제한일한장에 적용됩니다.int_fast16_t레지스터에 저장된 변수.하는 것은 동작이기 에, 는 크가큰 값너 작무보의 하위 합니다.x만약 표준이 그러한 유형을 허용한다면, 유연한 "최소 16비트, 그러나 편리하다면 더 많은" 유형은 그러한 지침의 필요성을 없앨 수 있습니다.
두 가지 유형이 어떻게 다를 수 있는지에 대한 예를 들어 보겠습니다. 8비트, 16비트, 32비트 및 64비트 산술이 동일하게 빠른 아키텍처가 있다고 가정합니다. (i386이 근접합니다.)는 모델을 하거나 ILP64,, 할 수 할 수 LLP64는 LLP64, LP64, LLP64는 LLP64입니다. 왜냐하면 길이가 정확하게 32비트라고 가정하는 코드가 많기 때문입니다.sizeof(int) <= sizeof(void*) <= sizeof(long)모든 64비트 구현은 이러한 가정 중 하나 이상을 위반해야 합니다.
그런 경우에는,int아마도 32비트 너비일 것입니다, 왜냐하면 그것은 다른 시스템으로부터 가장 작은 코드를 깨트릴 것이기 때문입니다, 하지만.uint_fast16_t16비트 너비로 공간을 절약할 수 있습니다.
언급URL : https://stackoverflow.com/questions/30942107/whats-the-difference-between-int-and-int-fast16-t
'codememo' 카테고리의 다른 글
| 트랜잭션 내에서 테이블 잘라내기 (0) | 2023.07.13 |
|---|---|
| 오류: 사용자를 추가할 수 없음: 테스트에서 {createUser: (0) | 2023.07.07 |
| Mongoose 채우기 하위 하위 문서 (0) | 2023.07.07 |
| Next.js에서 next-env.d.ts 파일을 어떻게 사용합니까? (0) | 2023.07.07 |
| powershell을 사용하여 .sql 파일을 실행하는 방법은 무엇입니까? (0) | 2023.07.07 |