it-source

intXX_t와 int_fastXX_t의 차이점은 무엇입니까?

criticalcode 2022. 10. 20. 21:16
반응형

intXX_t와 int_fastXX_t의 차이점은 무엇입니까?

나는 최근에 int_fast32_tint_fast64_t를 주로 하는 표준 가장 빠른 유형의 존재를 발견했다.

메인스트림 아키텍처에서 통상적인 사용을 위해서는 항상 프로세서의 디폴트 읽기 용량에 맞는 classical int & long을 사용하는 것이 좋기 때문에 불필요한 수치 변환은 피해야 한다고 항상 들었습니다.

C99 표준에서는, 「7.18.1.3p2」에 기재되어 있습니다.

"typedef name int_fastN_t는 너비가 N 이상인 가장 빠른 서명된 정수 유형을 나타냅니다.typedef name uint_fastN_t는 너비가 N 이상인 가장 빠른 부호 없는 정수 유형을 나타냅니다."

또한 § 7.18.1.3p1에 이에 대한 견적이 있습니다.

「지정 타입이 모든 목적에 있어서 가장 빠르다고 보증하는 것은 아닙니다.실장할 때 어떤 타입을 다른 타입보다 선택할 명확한 근거가 없는 경우, 부호화 및 너비 요건을 만족시키는 정수 타입을 선택할 뿐입니다.」

내게 가장 빠른 것이 무엇을 의미하는지 명확하지 않다.이 타입은 언제 사용해야 하는지, 사용해서는 안 되는 것인지 잘 모르겠습니다.

이에 대해 구글에서 조금 검색해 보니 일부 오픈 소스 프로젝트가 일부 기능을 변경한 것은 사실이지만 모든 기능이 변경된 것은 아닙니다.코드의 일부만 변경한 이유는 설명하지 않았습니다.

int_fastXX_t가 기존의 것보다 매우 빠를 때의 구체적인 케이스/사용법을 알고 계십니까?

C99 표준에서는 7.18.1.3 최소 폭 정수형이 가장 빠릅니다.

(7.18.1.3p1) "다음의 각 형식은 적어도 지정된 폭을 갖는 모든 정수 형식 중에서 일반적으로 가장 빠른 정수 형식을 나타낸다"

225) "지정된 유형이 모든 목적에서 가장 빠르다고 보장되는 것은 아닙니다. 구현에 어떤 유형을 선택할 명확한 근거가 없는 경우 부호 및 너비 요건을 충족하는 정수 유형을 선택할 뿐입니다."

그리고.

(7.18.1.3p2) "typedef name int_fastN_t는 너비가 N 이상인 가장 빠른 부호 있는 정수 유형을 나타냅니다.typedef name uint_fastN_t는 너비가 N 이상인 가장 빠른 부호 없는 정수 유형을 나타냅니다."

' 」int_fastN_t ★★★★★★★★★★★★★★★★★」uint_fastN_t합니다.intN_t ★★★★★★★★★★★★★★★★★」uintN_t에서는, 「」를 이 보증되고 있습니다.N 단, 더 타입을 할 수 있는 에서는 더 될 수 하는 것입니다. 단, 더 큰 타입을 사용하여 최적화를 실행할 수 있는 경우 구현에 더 많은 비트가 소요될 수 있습니다.그것은, 적어도 비트가 필요함을 보증하는 것입니다.N

들어 머신의 32비트입니다.uint_fast16_t라고 할 수 unsigned int unsigned short왜냐하면 기계어 크기를 사용하는 것이 더 효율적이기 때문입니다.

다른 최소 의 정수형C)입니다.int_leastN_t ★★★★★★★★★★★★★★★★★」uint_leastN_t가 필요합니다.

Gnu libc는 64비트 CPU에 대해 컴파일할 경우 {int,uint}_fast{16,32}_t를 64비트로 정의하고, 그렇지 않을 경우 32비트로 정의합니다.64비트 정수의 동작은 32비트 정수의 동작보다 Intel 및 AMD 64비트 x86 CPU의 동작이 빠릅니다.

아마 다른 하드웨어에서는 차이가 없을 것입니다.int32_t ★★★★★★★★★★★★★★★★★」int16_t재재존

, 「 」를 할 수 있습니다.int_least16_t16비트를 포함할 수 있는 최소 유형을 가져옵니다.공간을 절약하고 싶다면 중요할 수 있습니다.

「」, 「」를 사용합니다.int_fast16_t이 나올 수 있습니다.보다 큰 타입이 나올 수 있습니다.int_least16_t그러나 "정수" 정수의 경우 속도가 더 빠를 수 있습니다.구현에서는 무엇이 더 빠르고 무엇이 일반적인지 고려해야 합니다.어떤 특수한 용도의 하드웨어에서는 이것이 명백하지 않을까요?

에서는, , 「의 typypedef는 16비트입니다.short신경 쓰지 않아도 됩니다.

IMO 그것들은 꽤 무의미하다.

컴파일러는 사용자가 타입이라고 부르는 것은 신경 쓰지 않습니다.사이즈나 룰이 어떻게 적용되는지만 신경 쓰지 않습니다.따라서 int, in32_t, int_fast32_t가 모두 플랫폼상의 32비트라면 거의 같은 동작을 합니다.

이 이론은 언어 구현자가 하드웨어에서 가장 빠른 것을 기준으로 선택해야 한다는 것이지만, 표준 작성자는 결코 가장 빠른 것에 대한 명확한 정의를 내리지 않았습니다.게다가 플랫폼유지관리자는 이러한 유형의 정의를 변경하는 것을 꺼리고 있습니다(ABI 브레이크가 되기 때문에).정의는 플랫폼의 라이프 사이클이 시작될 때 임의로 선택되고(또는 C 라이브러리가 포팅된 다른 플랫폼에서 상속됨) 다시는 건드리지 않습니다.

미세 최적화 수준에 있어 가변 크기가 큰 차이를 일으킬 수 있다고 생각되는 경우 프로세서의 코드사용하여 다양한 옵션을 벤치마킹합니다.그렇지 않으면 걱정하지 마세요.「고속」타입에서는, 편리한 IMO는 추가되지 않습니다.

언급URL : https://stackoverflow.com/questions/9239558/what-is-the-difference-between-intxx-t-and-int-fastxx-t

반응형