Portanto, a razão para typedef
: tipos de dados primitivos ed é abstrair a representação de baixo nível e torná-la mais fácil de compreender (em uint64_t
vez do long long
tipo, que é de 8 bytes).
No entanto, existe o uint_fast32_t
que tem o mesmo typedef
que uint32_t
. Usar a versão "rápida" tornará o programa mais rápido?
Respostas:
int
pode ser tão pequeno quanto 16 bits em algumas plataformas. Pode não ser suficiente para seu aplicativo.uint32_t
não tem garantia de existência. É um opcionaltypedef
que a implementação deve fornecer iff tem um tipo inteiro não assinado de exatamente 32 bits. Alguns têm bytes de 9 bits, por exemplo, portanto, não têm umuint32_t
.uint_fast32_t
afirma sua intenção claramente: é um tipo de pelo menos 32 bits que é o melhor do ponto de vista do desempenho.uint_fast32_t
pode ter de fato 64 bits. Depende da implementação.O que você está olhando não é o padrão. É uma implementação particular (BlackBerry). Então você não pode deduzir daí que
uint_fast32_t
é sempre o mesmo queuint32_t
.Veja também:
Arquiteturas exóticas com as quais os comitês de padrões se preocupam .
Minha visão pragmática baseada em opinião de tipos inteiros em C e C ++ .
fonte
uint_least32_t
também, que é o mesmo,uint_fast32_t
exceto que favorece lojas menores em vez de velocidade.A diferença está na exatidão e disponibilidade.
O doc aqui diz:
E
Portanto, a diferença é bastante clara:
uint32_t
é um tipo que tem exatamente32
bits, e uma implementação deve fornecê-lo apenas se tiver exatamente 32 bits, e então pode definir esse tipo comouint32_t
. Isso significa queuint32_t
pode ou não estar disponível .Por outro lado,
uint_fast32_t
é um tipo que possui pelo menos 32 bits, o que também significa, se uma implementação pode ser digitadauint32_t
comouint_fast32_t
se ela fornecesseuint32_t
. Se não forneceruint32_t
,uint_fast32_t
pode ser um typedef de qualquer tipo que tenha pelo menos32
bits.fonte
uint32_t
é exatamente 32 bits em todos os sistemas (se existir), o que pode não ser mais rápido em comparação com aquele que tem, digamos, 64 bits.uint_fast32_t
por outro lado, pelo menos 32 bits, pode ser até 64 bits.uint16_t x;
for armazenado em um registro de 32 bits no ARM7-TDMI, o códigox++;
pode precisar ser avaliado comox=((x+1)<<16)>>16);
. Em compiladores para essa plataforma,uint_fast16_t
provavelmente seria definido como sinônimouint32_t
de evitar isso.[u]int_(fast|least)N_t
também não são opcionais? Certamente nem todas as arquiteturas são exigidas pelo Padrão para suportar tipos primitivos de pelo menos 64 bits. No entanto, a formulação parastdint.h
implica que eles devem. Parece estranho para mim que tenhamos reforçado isso desde 1999, alguns anos antes da computação de 64 bits se tornar dominante - para não falar do atraso (em muitos casos ainda atual) das arquiteturas embarcadas. Isso parece um grande descuido para mim.Quando você está
#include inttypes.h
em seu programa, obtém acesso a várias maneiras diferentes de representar números inteiros.O tipo uint_fast * _t simplesmente define o tipo mais rápido para representar um determinado número de bits.
Pense assim: você define uma variável do tipo
short
e a usa várias vezes no programa, o que é totalmente válido. No entanto, o sistema no qual você está trabalhando pode funcionar mais rapidamente com valores do tipoint
. Ao definir uma variável como tipouint_fast*t
, o computador simplesmente escolhe a representação mais eficiente com a qual pode trabalhar.Se não houver diferença entre essas representações, o sistema escolhe a que deseja e a usa de forma consistente em todas as partes.
fonte
Observe que a versão rápida pode ser maior que 32 bits. Enquanto o int rápido vai caber bem em um registro e ser alinhado e coisas do tipo: mas, ele vai usar mais memória. Se você tiver grandes matrizes desses, seu programa será mais lento devido a mais acessos de cache de memória e largura de banda.
Não creio que o CPUS moderno se beneficie do fast_int32, já que geralmente a extensão do sinal de 32 a 64 bits pode acontecer durante a instrução de carregamento e a ideia de que existe um formato inteiro 'nativo' que é mais rápido é antiquada.
fonte