58 votes

Quelle est la différence entre intXX_t et int_fastXX_t?

J'ai récemment découvert l'existence de la norme la plus rapide de type, principalement int_fast32_t et int_fast64_t.

On m'a toujours dit que, pour une utilisation normale traditionnels de l'architecture, il faut mieux utiliser classique int & long qui doit correspondre au processeur de lecture par défaut de la capacité et ainsi éviter d'inutiles conversions numériques.

Dans le Standard C99, il est dit au §7.18.1.3p2 :

"La définition de type nom int_fastN_t désigne la manière la plus rapide signé de type entier avec une largeur d'au moins N. typedef nom uint_fastN_t désigne le plus rapide type entier non signé d'une largeur d'au moins N."

Et il y a aussi une citation à ce sujet au §7.18.1.3p1 :

"Le type n'est pas garanti d'être le plus rapide pour tous les usages; si la mise en œuvre n'a pas de raisons pour le choix d'un type plutôt qu'un autre, il va tout simplement de choisir parmi un nombre entier de type satisfaire les ce paramètre et les exigences de largeur."

Il est clair pour moi ce que le plus rapide signifie vraiment. Je ne comprends pas quand je dois utiliser ce type et quand je ne le devrait pas.

J'ai googlé un peu sur ce et a constaté que certains open source, les projets ont changé certaines de leurs fonctions, mais pas tous d'entre eux. Ils n'ont pas vraiment expliquer pourquoi ils ont changé une partie, et seulement une partie de leur code.

Savez-vous quels sont les cas particuliers/usages lorsque int_fastXX_t sont vraiment plus rapide que le classique ?

27voto

ouah Points 75311

Dans le Standard C99, 7.18.1.3 plus Rapide minimum de la largeur des types d'entiers.

(7.18.1.3p1) "Chacun des types suivants désigne un type entier, qui est généralement fastest225) pour fonctionner avec tous les types d'entiers qui ont au moins la largeur spécifiée."

225) "Du type désigné n'est pas garanti d'être le plus rapide pour tous les usages; si la mise en œuvre n'a pas de raisons pour le choix d'un type plutôt qu'un autre, il va tout simplement de choisir parmi un nombre entier de type satisfaire les ce paramètre et les exigences de largeur."

et

(7.18.1.3p2) "La définition de type nom int_fastN_t désigne la manière la plus rapide signé de type entier avec une largeur d'au moins N. typedef nom uint_fastN_t désigne la manière la plus rapide d'entier non signé type avec une largeur d'au moins N."

Les types d' int_fastN_t et uint_fastN_t sont homologues à l'exacte de la largeur des types d'entiers intN_t et uintN_t. La mise en œuvre des garanties qu'ils prennent au moins N bits, mais la mise en œuvre peut prendre plus de bits si elle peut effectuer une optimisation de l'utilisation de plus grands types; c'est juste que les garanties qu'ils prennent au moins N bits.

Par exemple, sur une machine 32 bits, uint_fast16_t pourrait être définie comme un unsigned int plutôt que comme un unsigned short parce que travailler avec les types de machine de la taille de mot serait plus efficace.

Une autre raison de leur existence est la reproduction exacte de la largeur des types d'entiers sont facultatifs en C, mais la manière la plus rapide minimum de la largeur des types d'entiers et le minimum de la largeur des types d'entiers (int_leastN_t et uint_leastN_t) sont requis.

5voto

user833771 Points 21

Gnu libc définit {int,uint}_fast{16,32}_t (64 bits lors de la compilation pour les Cpu 64 bits et 32 bits autrement. Les opérations sur les entiers 64 bits sont plus rapides sur les processeurs Intel et AMD 64-bit x86 Processeurs que les mêmes opérations sur les nombres entiers de 32 bits.

3voto

Bo Persson Points 42821

Il ne sera probablement pas avoir une différence, sauf exotique matériel où int32_t et int16_t qui n'existent même pas.

Dans ce cas, vous pouvez utiliser int_least16_t pour obtenir le plus petit type qui peut contenir 16 bits. Pourrait être important si vous souhaitez économiser de l'espace.

D'autre part, l'utilisation d' int_fast16_t pourrait vous obtenir un autre type, plus grand que int_least16_t mais peut-être plus rapide pour le "type" integer utilisation. La mise en œuvre de considérer ce qui est plus rapide et ce qui est typique. C'est peut-être évident pour certains à des fins spéciales de matériel?

Sur la plupart des communes de ces machines 16 bits types seront tous un typedef pour short, et vous n'avez pas à se soucier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X