IT박스

uint8_t, uint_fast8_t 및 uint_least8_t의 차이점

itboxs 2020. 11. 1. 17:28

uint8_t, uint_fast8_t 및 uint_least8_t의 차이점


C99 표준은 다음 데이터 유형을 도입합니다. AVR stdint 라이브러리에 대한 문서는 여기 에서 찾을 수 있습니다 .

  • uint8_t 8 비트 부호없는 유형임을 의미합니다.
  • uint_fast8_t 최소 8 비트의 가장 빠른 unsigned int를 의미합니다.
  • uint_least8_t 8 비트 이상의 부호없는 정수임을 의미합니다.

나는 이해 uint8_t하고 무엇인지 uint_fast8_t(레지스터 수준에서 어떻게 구현되는지 모르겠습니다).

1. " unsigned int최소 8 비트가 있습니다" 의 의미가 무엇인지 설명해 주 시겠습니까?

2.How uint_fast8_tuint_least8_t에 비해 도움말 증가 효율성 / 코드 공간 uint8_t?


uint_least8_t최소 8 비트가있는 가장 작은 유형입니다. uint_fast8_t최소 8 비트가있는 가장 빠른 유형입니다.

이국적인 건축물을 상상 해보면 차이점을 알 수 있습니다. 20 비트 아키텍처를 상상해보십시오. 그는 unsigned int20 비트 (하나의 레지스터)를 갖고, 그는 unsigned char10 개 비트를 갖는다. 따라서 유형을 sizeof(int) == 2사용 char하려면 레지스터를 반으로 자르려면 추가 명령이 필요합니다. 그때:

  • uint8_t: 정의되지 않았습니다 (8 비트 유형 없음).
  • uint_least8_t: is unsigned char, 최소 8 비트 인 가장 작은 유형입니다.
  • uint_fast8_t: unsigned int내 가상 아키텍처에서 반 레지스터 변수가 전체 레지스터 변수보다 느리기 때문입니다.

uint8_t 의미 : 정확히 8 비트의 부호없는 정수를 제공합니다.

uint_least8_t의미 : 최소 8 비트가있는 가장 작은 유형의 unsigned int를 제공하십시오. 메모리 소비를 최적화합니다.

uint_fast8_t의미 : 최소 8 비트의 부호없는 정수를 제공합니다. 정렬 고려 사항 때문에 내 프로그램을 더 빠르게 만들려면 더 큰 유형을 선택하십시오. 속도를 최적화하십시오.

또한 일반 int유형 과 달리 위의 stdint.h 유형의 서명 된 버전은 2의 보수 형식이 보장됩니다.


이론은 다음과 같습니다.

uint8_t정확히 8 비트 여야하지만 존재하지 않아도됩니다. 따라서 8 비트 정수의 모듈로 256 할당 동작 *에 의존하고 모호한 아키텍처에서 오동작보다 컴파일 실패를 선호하는 경우에 사용해야합니다.

uint_least8_t8 비트 이상을 저장할 수있는 사용 가능한 가장 작은 부호없는 정수 유형이어야합니다. 큰 배열과 같은 것의 메모리 사용을 최소화하고자 할 때 사용합니다.

uint_fast8_t최소 8 비트를 저장할 수있는 "가장 빠른"부호없는 유형이어야합니다. 그러나 주어진 프로세서에서 주어진 작업에 대해 실제로 가장 빠르다는 보장은 없습니다. 값에 대해 많은 작업을 수행하는 코드를 처리하는 데 사용합니다.

관행은 "빠름"및 "최소"유형이 많이 사용되지 않는 것입니다.

"최소"유형은 대부분의 사람들이하지 않는 CHAR_BIT! = 8을 사용하여 아키텍쳐를 모호하게하는 이식성에 관심이있는 경우에만 실제로 유용합니다.

"빠른"유형의 문제점은 "가장 빠름"이 고정하기 어렵다는 것입니다. 더 작은 유형은 메모리 / 캐시 시스템의로드가 적다는 것을 의미 할 수 있지만 기본보다 작은 유형을 사용하면 추가 명령이 필요할 수 있습니다. 또한 가장 좋은 것은 아키텍처 버전간에 변경 될 수 있지만 구현자는 종종 이러한 경우 ABI를 손상시키지 않으려 고합니다.

일부 인기있는 구현을 살펴보면 uint_fastn_t 의 정의 는 상당히 임의적 인 것 같습니다 . glibc는 많은 최신 프로세서 (특히 64 비트 프로세서)가 네이티브 단어보다 작은 항목에 대한 빠른 작업을 지원한다는 사실을 고려하지 않고 최소한 해당 시스템의 "네이티브 워드 크기"로 정의하는 것으로 보입니다. 크기. IOS는 분명히 그것들을 고정 크기 유형과 동일하게 정의합니다. 다른 플랫폼은 다를 수 있습니다.

대체로 작은 정수를 사용하는 타이트한 코드의 성능이 목표라면 다른 크기의 유형으로 관심있는 플랫폼에서 코드를 벤치마킹 하여 가장 잘 작동하는 것을 확인해야합니다.

* 불행히도 모듈로 256 할당 동작은 C의 정수 승격 오류로 인해 항상 모듈로 256 산술을 의미하지는 않습니다.


일부 프로세서는 큰 데이터 형식만큼 작은 데이터 형식에서 효율적으로 작동 할 수 없습니다. 예를 들면 다음과 같습니다.

uint32_t foo(uint32_t x, uint8_t y)
{
  x+=y;
  y+=2;
  x+=y;
  y+=4;
  x+=y;
  y+=6;
  x+=y;
  return x;
}

경우 y하였다 uint32_t는 ARM 코어 텍스 M3를위한 컴파일러는 간단하게 생성 할 수

add r0,r0,r1,asl #2   ; x+=(y<<2)
add r0,r0,#12         ; x+=12
bx  lr                ; return x

이후하지만 y입니다 uint8_t컴파일러 대신 생성해야합니다 :

add r0,r0,r1          ; x+=y
add r1,r1,#2          ; Compute y+2
and r1,r1,#255        ; y=(y+2) & 255
add r0,r0,r1          ; x+=y
add r1,r1,#4          ; Compute y+4
and r1,r1,#255        ; y=(y+4) & 255
add r0,r0,r1          ; x+=y
add r1,r1,#6          ; Compute y+6
and r1,r1,#255        ; y=(y+6) & 255
add r0,r0,r1          ; x+=y
bx  lr                ; return x

"빠른"유형의 의도 된 목적은 컴파일러가 효율적으로 처리 할 수없는 작은 유형을 더 빠른 유형으로 대체 할 수 있도록하는 것이 었습니다. 안타깝게도 "빠른"유형의 의미는 다소 잘못 지정되어 있으므로식이 부호가있는 수학을 사용하는지 서명되지 않은 수학을 사용하여 평가되는지에 대한 모호한 질문을 남깁니다.


1.Can you explain what is the meaning of "it's an unsigned int with at least 8 bits"?

That ought to be obvious. It means that it's an unsigned integer type, and that it's width is at least 8 bits. In effect this means that it can at least hold the numbers 0 through 255, and it can definitely not hold negative numbers, but it may be able to hold numbers higher than 255.

Obviously you should not use any of these types if you plan to store any number outside the range 0 through 255 (and you want it to be portable).

2.How uint_fast8_t and uint_least8_t help increase efficiency/code space compared to the uint8_t?

uint_fast8_t is required to be faster so you should use that if your requirement is that the code be fast. uint_least8_t on the other hand requires that there is no candidate of lesser size - so you would use that if size is the concern.


And of course you use only uint8_t when you absolutely require it to be exactly 8 bits. Using uint8_t may make the code non-portable as uint8_t is not required to exist (because such small integer type does not exist on certain platforms).


The "fast" integer types are defined to be the fastest integer available with at least the amount of bits required (in your case 8).

A platform can define uint_fast8_t as uint8_t then there will be absolutely no difference in speed.

The reason is that there are platforms that are slower when not using their native word length.

참고URL : https://stackoverflow.com/questions/35055042/difference-between-uint8-t-uint-fast8-t-and-uint-least8-t