Ainsi, la raison pour les types de données primitifs typedef
: ed est d’abréger la représentation de bas niveau et de la rendre plus facile à comprendre (uint64_t
au lieu du type long long
, qui est de 8 octets).
Cependant, il existe uint_fast32_t
qui a la même typedef
que uint32_t
. L'utilisation de la version "rapide" accélérera-t-elle le programme?
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 pour exister. typedef
est facultatif. L'implémentation doit indiquer si et seulement si elle a un type entier non signé de 32 bits exactement. Certains ont des octets de 9 bits par exemple, ils n'ont donc pas de uint32_t
.uint_fast32_t
indique clairement votre intention: il s'agit d'un type de au moins 32 bits qui est le meilleur du point de vue des performances. uint_fast32_t
peut en fait être de 64 bits. C'est à la mise en œuvre.... il y a
uint_fast32_t
qui a le même typef queuint32_t
...
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
est toujours le même que uint32_t
.
Voir également:
La différence réside dans leur exactitude et leur disponibilité.
Le doc dit ici:
type entier non signé avec une largeur de exactement 8, 16, 32 et 64 bits respectivement (fourni uniquement si l'implémentation prend directement en charge le type):
uint8_t uint16_t uint32_t uint64_t
Et
type d'entier non signé non signé le plus rapide avec une largeur de au moins 8, 16, 32 et 64 bits respectivement
uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
Donc, la différence est assez claire: uint32_t
est un type qui a exactement32
bits, et une implémentation devrait le fournir uniquement si il a le type avec exactement 32 bits et puis il peut saisir ce type en tant que uint32_t
. Cela signifie que uint32_t
peut être ou ne pas être disponible _.
Par ailleurs, uint_fast32_t
est un type qui a au moins 32 bits, ce qui signifie également si une implémentation peut typedef uint32_t
sous la forme uint_fast32_t
si il fournit uint32_t
. S'il ne fournit pas uint32_t
, alors uint_fast32_t
pourrait être une typedef de n'importe quel type comportant au moins 32
bits.
Lorsque vous #include inttypes.h
dans votre programme, vous avez accès à différentes méthodes pour représenter des nombres 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 tout à fait valable. Toutefois, le système sur lequel vous travaillez peut travailler plus rapidement avec les valeurs de type int
. En définissant une variable de type uint_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, le système choisit celle qu'il veut et l'utilise systématiquement.
Notez que la version rapide pourrait être supérieure à 32 bits. Alors que l'int rapide s'insérera parfaitement dans un registre et sera aligné et similaire: mais, il utilisera plus de mémoire. Si vous avez de grandes baies de celles-ci, votre programme sera plus lent en raison de la quantité de mémoire cache atteinte et de la bande passante.
Je ne pense pas que les CPUS modernes tireront profit de fast_int32, car le signe d'une extension de 32 à 64 bits peut généralement se produire pendant l'instruction de chargement et l'idée qu'il existe un format entier 'natif' plus rapide est désuète.