La théorie est la suivante :
uint8_t
doit avoir exactement 8 bits, mais il n'est pas obligé d'exister. Vous devez donc l'utiliser lorsque vous comptez sur le comportement arithmétique modulo-256 d'un entier de 8 bits et lorsque vous préférez un échec de compilation à un mauvais comportement sur des architectures obscures.
uint_least8_t
doit être le plus petit type d'entier non signé disponible qui peut stocker au moins 8 bits. Vous l'utiliserez lorsque vous voudrez minimiser l'utilisation de la mémoire pour des choses comme les grands tableaux.
uint_fast8_t
est censé être le type non signé "le plus rapide" pouvant stocker au moins 8 bits ; toutefois, il n'est pas garanti qu'il soit le plus rapide pour une opération donnée sur un processeur donné. Vous l'utiliserez dans un code de traitement qui effectue de nombreuses opérations sur la valeur.
Dans la pratique, les types "fast" et "least" ne sont pas beaucoup utilisés.
Les types "les moins" ne sont vraiment utiles que si vous vous souciez de la portabilité sur des architectures obscures avec CHAR_BIT != 8, ce qui n'est pas le cas de la plupart des gens.
Le problème avec les types "rapides" est que le terme "le plus rapide" est difficile à cerner. Un type plus petit peut signifier une charge moindre sur le système de mémoire/cache, mais l'utilisation d'un type plus petit que le type natif peut nécessiter des instructions supplémentaires. De plus, la meilleure solution peut changer d'une version d'architecture à l'autre, mais les implémenteurs veulent souvent éviter de casser l'ABI dans de tels cas.
En regardant certaines implémentations populaires, il semble que les définitions de uint_fastn_t sont assez arbitraires. La glibc semble les définir comme ayant au moins la "taille de mot native" du système en question, sans tenir compte du fait que de nombreux processeurs modernes (surtout ceux à 64 bits) ont un support spécifique pour les opérations rapides sur des éléments plus petits que leur taille de mot native. IOS les définit apparemment comme équivalents aux types de taille fixe. Les autres plateformes peuvent varier.
Dans l'ensemble, si la performance d'un code serré avec des entiers minuscules est votre objectif, vous devriez faire du benchmarking. su code sur les plateformes qui vous intéressent avec différents types de taille pour voir ce qui fonctionne le mieux.
0 votes
Pour votre première question, je peux imaginer qu'alors que
uint8_t
est garanti comme étant de 8 bits,uint_fast8_t
est garanti d'être >= 8 bits, tout comme uneunsigned char
.1 votes
Une des considérations est que
uint8_t
n'existe pas sur les systèmes qui n'ont pas un type 8 bits natif. Les deux autres seront là.11 votes
Vous avez obtenu des réponses faisant référence à des architectures "obscures" et "exotiques". Ces termes sont un peu biaisés. Bien sûr, si votre seule expérience est celle des systèmes de bureau, ces architectures sont en dehors de votre champ d'expérience. Mais "je n'ai jamais vu ça avant" n'est pas la même chose que "c'est obscur ou exotique". Pour les personnes qui travaillent avec des systèmes embarqués ou des DSP, ces choses sont assez courantes.
4 votes
Duplicata possible de La différence entre int8_t, int_least8_t et int_fast8_t ?