source

고속 정수형이 다른 정수형보다 빠른 이유는 무엇입니까?

factcode 2022. 8. 14. 11:55
반응형

고속 정수형이 다른 정수형보다 빠른 이유는 무엇입니까?

ISO/IEC 9899:2018(C18)에서는 7.20.1.3에 따라 기술되어 있습니다.

7.20.1.3 가장 빠른 최소 폭 정수형

1 다음 각 유형은 적어도 지정된 폭을 가진 모든 정수 유형 중에서 일반적으로268) 가장 빠르게 작동하는 정수 유형을 지정합니다.

name 2 typedef 。int_fastN_t 있는 . typedef 。uint_fastN_t인 가장 정수 .

3 다음 유형이 필요합니다.

int_fast8_t,int_fast16_t,int_fast32_t,int_fast64_t,uint_fast8_t,uint_fast16_t,uint_fast32_t,uint_fast64_t

이 양식의 다른 모든 유형은 선택 사항입니다.


268) 지정 타입이 모든 목적으로 가장 빠르다고 보증되는 것은 아닙니다.실장에 어떤 타입을 선택할 명확한 근거가 없는 경우 부호화 요건과 폭 요건을 충족하는 정수 타입을 선택할 뿐입니다.


그러나 이러한 "빠른" 정수 유형이 더 빠른 이유는 설명되지 않았습니다.

  • 이한한른른른른른른른른른른른른른른른른른른른른?

질문에 C++ .은 C++의 에는 C할 수 있기 입니다.왜냐하면 고속 정수 타입은 C++17의 헤더 파일에서도 사용할 수 있기 때문입니다.cstdintISO/IEC 14882:2017(C++17)입니다.그 이외의 섹션은 질문 본문에 실장되어 있습니다.


: c 、 C 、 C 、 것 、 of of of of of of of of of파일됩니다.stdint.h.

64 의 「CPU」이제 이러한 CPU에 서명되지 않은8비트 추가를 구현하는 방법을 상상해 보십시오.올바른 결과를 얻으려면 반드시 두 가지 이상의 작업이 필요합니다.이러한 CPU에서는 64비트 동작이 다른 정수폭에서의 동작보다 빠릅니다.에서는 모든 Xint_fastY_t64비트 타입의 에일리어스일 가능성이 있습니다.

고속 는 보다 고속으로 동작합니다.Xint_fastY_t는 모든 Y비트를 나타내는 데 필요한 것보다 넓은 유형의 에일리어스가 되지 않습니다(해당 에일리어스는 아닙니다.

궁금해서 일부 아키텍처에서 특정 구현(GNU, Linux)의 크기를 확인했습니다.이것들은, 같은 아키텍처상의 모든 실장에서는 동일하지 않습니다.

┌────╥───────────────────────────────────────────────────────────┐
│ Y  ║   sizeof(Xint_fastY_t) * CHAR_BIT                         │
│    ╟────────┬─────┬───────┬─────┬────────┬──────┬────────┬─────┤
│    ║ x86-64 │ x86 │ ARM64 │ ARM │ MIPS64 │ MIPS │ MSP430 │ AVR │
╞════╬════════╪═════╪═══════╪═════╪════════╪══════╪════════╪═════╡
│ 8  ║ 8      │ 8   │ 8     │ 32  │ 8      │ 8    │ 16     │ 8   │
│ 16 ║ 64     │ 32  │ 64    │ 32  │ 64     │ 32   │ 16     │ 16  │
│ 32 ║ 64     │ 32  │ 64    │ 32  │ 64     │ 32   │ 32     │ 32  │
│ 64 ║ 64     │ 64  │ 64    │ 64  │ 64     │ 64   │ 64     │ 64  │
└────╨────────┴─────┴───────┴─────┴────────┴──────┴────────┴─────┘

큰 타입의 조작이 고속이 되는 경우도 있습니다만, 이러한 타입의 조작은 캐시에 더 많은 공간을 차지하기 때문에, 이러한 타입을 사용한다고 해서 반드시 퍼포먼스가 향상되는 것은 아닙니다.게다가 그 실장이 처음부터 올바른 선택을 했다고 항상 믿을 수 있는 것은 아닙니다.항상 그렇듯이 최적의 결과를 얻으려면 측정이 필요합니다.


표의 스크린샷(Android 사용자용):

위 표의 스크린샷

(Android에는 모노 글꼴에 상자 그리기 문자가 없습니다 - ref)

적어도 믿을 수 있는 것은 아니다.

패스트 타입은 일반 타입의 typedef일 뿐이지만, 그것들을 정의하는 방법은 구현에 달려 있습니다.최소한 요청된 크기여야 하지만 더 클 수 있습니다.

일부 아키텍처에서는 일부 정수형이 다른 정수형보다 더 나은 성능을 갖는 것이 사실입니다.예를 들어 초기 ARM 구현에서는 32비트 워드 및 부호 없는 바이트에 대한 메모리 액세스 명령이 있었지만 하프 워드 또는 부호 있는 바이트에 대한 명령은 없었습니다.하프 워드와 서명 바이트 명령어는 나중에 추가되었지만, 여분의 인코딩 공간에 구두주걱을 넣어야 했기 때문에 여전히 주소 지정 옵션이 유연하지 않습니다.또한 ARM에 대한 모든 실제 데이터 처리 명령은 단어에 따라 작동하므로 정확한 결과를 얻기 위해 계산 후 더 작은 값을 마스킹해야 할 수도 있습니다.

그러나 더 작은 값을 로드/저장/처리하기 위해 더 많은 명령이 필요하더라도 캐시 압력에 대한 경쟁 문제도 있습니다.값이 작을수록 캐시 누락 횟수가 줄어들면 성능이 향상될 수 있습니다.

많은 공통 플랫폼에서의 유형의 정의는 충분히 고려되지 않은 것 같습니다.특히 최신 64비트 플랫폼은 32비트 정수를 잘 지원하는 경향이 있지만, 이러한 플랫폼에서는 "고속" 유형이 불필요하게 64비트인 경우가 많습니다.

게다가 C 의 타입은 플랫폼의 ABI 의 일부가 됩니다.따라서 플랫폼 벤더가 바보 같은 선택을 했다는 것을 알게 되더라도 나중에 바보 같은 선택을 바꾸기는 어렵습니다.

"빠른" 유형은 무시하십시오.정수 성능에 관심이 있는 경우 사용 가능한 모든 크기를 기준으로 코드를 벤치마킹하십시오.

고속 타입은 다른 모든 정수 타입보다 빠르지 않습니다.사실 이 타입은 일부 "일반" 정수 타입(그 타입의 에일리어스일 뿐)과 동일합니다.이 타입은 어느 타입이든 비트수 이상의 값을 유지하는 것이 가장 빠릅니다.

고속 타입이 에일리어스인 정수 타입은 플랫폼에 의존합니다.

언급URL : https://stackoverflow.com/questions/59593541/why-are-the-fast-integer-types-faster-than-the-other-integer-types

반응형