Donc, la raison de typedef
: ed les types de données primitifs est d'abstraire la représentation de bas niveau et de la rendre plus facile à comprendre ( uint64_t
au lieu du long long
type, qui est de 8 octets).
Cependant, il y a uint_fast32_t
qui a le même typedef
que uint32_t
. L'utilisation de la version "rapide" rendra-t-elle le programme plus rapide?
Réponses:
int
peut être aussi petit que 16 bits sur certaines plates-formes. Cela peut ne pas être suffisant pour votre application.uint32_t
n'est pas garanti d'exister. C'est une optiontypedef
que l'implémentation doit fournir ssi elle a un type entier non signé d'exactement 32 bits. Certains ont des octets de 9 bits par exemple, ils n'ont donc pas de fichieruint32_t
.uint_fast32_t
indique clairement votre intention: c'est un type d' au moins 32 bits qui est le meilleur du point de vue des performances.uint_fast32_t
peut être en fait de 64 bits de long. Cela dépend de la mise en œuvre.Ce que vous regardez n'est pas la norme. C'est une implémentation particulière (BlackBerry). Vous ne pouvez donc pas en déduire que
uint_fast32_t
c'est toujours la même choseuint32_t
.Voir également:
Architectures exotiques dont se soucient les comités de normalisation .
Ma vision pragmatique basée sur l'opinion des types entiers en C et C ++ .
la source
uint_least32_t
, ce qui revient au même queuint_fast32_t
sauf que cela favorise un plus petit magasin plutôt que la vitesse.La différence réside dans leur exactitude et leur disponibilité.
Le doc ici dit:
Et
La différence est donc assez claire:
uint32_t
c'est un type qui a exactement des32
bits, et une implémentation ne devrait le fournir que si elle a un type avec exactement 32 bits, puis elle peut taper ce type commeuint32_t
. Cela signifie,uint32_t
peut ou peut ne pas être disponible .D'autre part,
uint_fast32_t
est un type qui a au moins 32 bits, ce qui signifie également, si une implémentation peut typedefuint32_t
commeuint_fast32_t
si elle fournituint32_t
. S'il ne fournit pasuint32_t
, alorsuint_fast32_t
pourrait être un typedef de n'importe quel type qui a au moins des32
bits.la source
uint32_t
exactement 32 bits sur tous les systèmes (s'il existe), ce qui n'est peut-être pas plus rapide que celui qui a, disons, 64 bits.uint_fast32_t
d'autre part au moins 32 bits, pourrait même être 64 bits.uint16_t x;
est stocké dans un registre 32 bits sur l'ARM7-TDMI, le codex++;
peut devoir être évalué commex=((x+1)<<16)>>16);
. Sur les compilateurs pour cette plate-forme,uint_fast16_t
serait probablement défini comme synonyme deuint32_t
pour éviter cela.[u]int_(fast|least)N_t
ne sont pas également facultatifs? Toutes les architectures ne sont certainement pas requises par la norme pour prendre en charge les types primitifs d'au moins 64 bits? Pourtant, le libellé pourstdint.h
implique qu'ils doivent. Il me semble étrange que nous appliquions cela depuis 1999, quelques années avant que l'informatique 64 bits ne devienne courante - sans parler du retard (dans de nombreux cas encore actuel) des architectures embarquées. Cela me semble être un gros oubli.Lorsque vous êtes
#include inttypes.h
dans votre programme, vous avez accès à un tas de façons différentes de représenter des entiers.Le type uint_fast * _t définit simplement le type le plus rapide pour représenter un nombre donné de bits.
Pensez-y de cette façon: vous définissez une variable de type
short
et vous l'utilisez plusieurs fois dans le programme, ce qui est totalement valide. Cependant, le système sur lequel vous travaillez peut fonctionner plus rapidement avec des valeurs de typeint
. En définissant une variable comme typeuint_fast*t
, l'ordinateur choisit simplement la représentation la plus efficace avec laquelle il peut travailler.S'il n'y a pas de différence entre ces représentations, alors le système choisit celle qu'il veut et l'utilise de manière cohérente.
la source
Notez que la version rapide peut être supérieure à 32 bits. Alors que le fast int s'intégrera bien dans un registre et sera aligné, etc., mais il utilisera plus de mémoire. Si vous avez de grands tableaux de ceux-ci, votre programme sera plus lent en raison de plus de hits de mémoire cache et de bande passante.
Je ne pense pas que le CPUS moderne bénéficiera de fast_int32, car en général, l'extension du signe de 32 à 64 bits peut se produire pendant l'instruction de chargement et l'idée qu'il existe un format entier «natif» plus rapide est démodée.
la source