c++ - uint16 - Diferença entre uint8_t, uint_fast8_t e uint_least8_t




stdint.h download (4)

1.Pode explicar qual é o significado de "é um unsigned int com pelo menos 8 bits"?

Isso deveria ser óbvio. Isso significa que é um tipo inteiro sem sinal e que a largura é de pelo menos 8 bits. Com efeito, isso significa que pode pelo menos manter os números de 0 a 255, e definitivamente não pode conter números negativos, mas pode ser capaz de manter números maiores que 255.

Obviamente, você não deve usar nenhum desses tipos se planeja armazenar qualquer número fora do intervalo de 0 a 255 (e deseja que ele seja portátil).

2. Como uint_fast8_t e uint_least8_t ajudam a aumentar a eficiência / espaço de código em comparação com o uint8_t?

uint_fast8_t é necessário para ser mais rápido, então você deve usar isso se sua exigência for que o código seja rápido. uint_least8_t por outro lado, exige que não haja candidatos de menor tamanho - então você usaria isso se o tamanho fosse a preocupação.

E, claro, você usa apenas uint8_t quando você absolutamente requer que ele seja exatamente 8 bits. Usar uint8_t pode tornar o código não portátil, pois uint8_t não precisa existir (porque esse tipo de número inteiro pequeno não existe em certas plataformas).

O padrão C99 introduz os seguintes tipos de dados. A documentação pode ser encontrada here para a biblioteca de stdints do AVR.

  • uint8_t significa que é um tipo não assinado de 8 bits.
  • uint_fast8_t significa que é o mais rápido int não assinado com pelo menos 8 bits.
  • uint_least8_t significa que é um int não assinado com pelo menos 8 bits.

Eu entendo uint8_t e o que é uint_fast8_t (não sei como é implementado no nível de registro).

1.Pode explicar qual é o significado de "é um unsigned int com pelo menos 8 bits"?

2. Como uint_fast8_t e uint_least8_t ajudam a aumentar a eficiência / espaço de código em comparação com o uint8_t ?


A teoria é algo como:

uint8_t precisa ter exatamente 8 bits, mas não é necessário que exista. Então você deve usá-lo onde você está confiando no comportamento de atribuição de módulo-256 * de um inteiro de 8 bits e onde você preferiria uma falha de compilação ao mau comportamento em arquiteturas obscuras.

uint_least8_t é necessário para ser o menor tipo de inteiro não assinado disponível que pode armazenar pelo menos 8 bits. Você iria usá-lo quando quiser minimizar o uso de memória de coisas como grandes matrizes.

uint_fast8_t deve ser o tipo "mais rápido" não assinado que pode armazenar pelo menos 8 bits; no entanto, não é garantido que seja o mais rápido para qualquer operação em qualquer processador. Você o usaria no processamento de código que executa várias operações no valor.

A prática é que os tipos "rápido" e "mínimo" não são muito usados.

Os tipos "mínimos" só são realmente úteis se você se preocupa com a portabilidade para obscurecer arquiteturas com CHAR_BIT! = 8, o que a maioria das pessoas não faz.

O problema com os tipos "rápidos" é que "mais rápido" é difícil de definir. Um tipo menor pode significar menos carga no sistema de memória / cache, mas usar um tipo menor que o nativo pode exigir instruções extras. Além disso, o que é melhor pode mudar entre as versões de arquitetura, mas os implementadores muitas vezes querem evitar quebrar a ABI em tais casos.

Olhando para algumas implementações populares, parece que as definições de uint_fastn_t são bastante arbitrárias. A glibc parece defini-los como sendo pelo menos o "tamanho da palavra nativa" do sistema em questão sem levar em conta o fato de que muitos processadores modernos (especialmente os de 64 bits) têm suporte específico para operações rápidas em itens menores do que sua palavra nativa Tamanho. O IOS aparentemente os define como equivalentes aos tipos de tamanho fixo. Outras plataformas podem variar.

Em suma, se o desempenho do código restrito com números inteiros pequenos for o seu objetivo, você deve fazer o benchmark de seu código nas plataformas de seu interesse com tipos de tamanhos diferentes para ver o que funciona melhor.

* Note que, infelizmente, o comportamento de atribuição do módulo 256 nem sempre implica a aritmética do módulo 256, graças à falha na promoção do número inteiro do C.


Os tipos inteiros "rápidos" são definidos como o número inteiro mais rápido disponível com pelo menos a quantidade de bits necessária (no seu caso 8).

Uma plataforma pode definir uint_fast8_t como uint8_t então não haverá absolutamente nenhuma diferença na velocidade.

A razão é que existem plataformas que são mais lentas quando não estão usando o tamanho de sua palavra nativa.


uint8_t significa: me dê um int não assinado de exatamente 8 bits.

uint_least8_t significa: me dê o menor tipo de int não assinado que tenha pelo menos 8 bits. Otimizar para consumo de memória.

uint_fast8_t significa: me dê um int não assinado de pelo menos 8 bits. Escolha um tipo maior se isso tornar meu programa mais rápido, devido a considerações de alinhamento. Otimize a velocidade.

Além disso, ao contrário dos tipos int simples, a versão assinada dos tipos stdint.h acima é garantida como sendo o formato de complemento de 2.





c99