web-dev-qa-db-fra.com

Qu'est-ce que uint_fast32_t et pourquoi devrait-il être utilisé à la place de l'int régulière et de uint32_t?

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?

91
Amumu
  • 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 que uint32_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:

110
ybungalobill

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_tsi 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.

32
Nawaz

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.

2
Harley Sugarman

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.

0
Gil Colgate