40 votes

Dois-je utiliser cstdint ?

J'ai réfléchi à la question de savoir si je devais ou non utiliser les typedefs à l'intérieur de l'application <cstdint> ou pas.

Je préfère personnellement écrire uint32_t sur unsigned int y int8_t sur char etc... car pour moi c'est beaucoup plus intuitif.

Qu'est-ce que vous en pensez ? Est-ce une bonne idée d'utiliser les typedefs de <cstdint> ou pas ? Y a-t-il des inconvénients ?

37voto

Nemo Points 32838

En fait, je suggère d'utiliser les deux.

Si vous voulez quelque chose qui est définitivement 32-bits non signés, utilisez uint32_t. Par exemple, si vous implémentez un "struct" pour représenter un objet externe dont la spécification définit un de ses champs comme étant de 32 bits non signés.

Si vous voulez quelque chose qui correspond à la "taille de mot naturelle de la machine", utilisez int ou unsigned int. Par exemple :

for (int i = 0 ; i < 200 ; ++i)
    // stuff

La "taille de mot naturelle de la machine" vous donnera les meilleures performances, tant sur les processeurs d'aujourd'hui que sur ceux de demain.

Utilisez "char" si vous voulez dire "caractère" ; "char" ou "unsigned char" si vous voulez dire "octet". Le C/C++ vous permet d'accéder aux octets d'un objet arbitraire via "char *", et rien d'autre, à proprement parler.

Utilisez uint8_t ou int8_t si vous voulez spécifiquement un entier de 8 bits, comme uint32_t.

22voto

larsmans Points 167484

Vous devriez utiliser les deux. Vous devez utiliser int comme expliqué dans les autres réponses, lorsque vous avez besoin d'un entier de taille "raisonnable". Utilisez char quand vous avez besoin d'un caractère : c'est auto-documenté.

Vous devez utiliser uint32_t et amis lors de l'interface avec le monde extérieur en binaire : lors de la programmation en réseau, de la manipulation de fichiers binaires ou de l'utilisation d'encodages multi-octets étrangers, etc. Dans ces cas, la taille exacte d'un type est cruciale pour écrire un code correct, portable et auto-documenté. C'est pourquoi <stdint.h> (ou C++0x <cstdint> ) est pour.

(L'endiannité est également cruciale, mais c'est un tout autre sujet).

4voto

Ben Voigt Points 151460

Cela dépend de l'objectif de la variable.

Si vous avez besoin d'un compteur de boucle, utilisez int . Si vous avez besoin d'une chaîne de caractères, utilisez un tableau de char .

Si vous avez besoin d'une variable numérique pouvant contenir de -1 à 100, int8_t est bon. Si vous devez représenter une valeur de 0 à 100 000, alors uint32_t uint_least32_t (merci @Serge) est un excellent choix.

3voto

ZeRemz Points 551

Une situation particulière dans laquelle vous besoin de pour utiliser les typedefs de cstdint, c'est lorsqu'il s'agit de code qui fait beaucoup de conversions de pointeur à int, dans ce cas l'utilisation de intptr_t est une exigence absolue.

Dans l'entreprise pour laquelle je travaille, nous nous préparons à migrer de 32bits à 64bits des tonnes de code C/C++ de mauvaise qualité qui ne cesse de couler des pointeurs vers int puis de nouveau vers des pointeurs, ce qui échouera définitivement sur les architectures 64bits. Nous allons donc essayer d'assainir le code chaque fois que possible (c'est-à-dire modifier les structures de données et les interfaces pour supprimer entièrement le besoin de couler) et utiliser intptr_t au lieu de int partout ailleurs.

D'ailleurs, le casting en général devrait éveiller les soupçons, mais sérieusement, le casting de pointeurs vers des entiers est presque toujours la conséquence d'un grave défaut quelque part dans votre conception. En fait, vous mentez au compilateur, à la plate-forme et surtout à vos collègues chaque fois que vous cachez un pointeur derrière un int.

À part cela, comme d'autres l'ont dit : utilisez des types génériques lorsque cela est possible et des types de taille explicite lorsque cela est nécessaire.

1voto

BatchyX Points 2521

Il semble que vous n'ayez aucune idée de la différence entre uint32_t et unsigned int. C'est parfaitement normal, car vous ne savez pas nécessairement comment votre type sera utilisé plus tard.

Il suffit d'utiliser un typedef.

Indépendamment du fait que vous ayez besoin d'un unsigned int ou d'un uint32_t (auquel vous pourrez penser plus tard, lorsque vous aurez une vision plus complète de ce que sera votre programme), l'utilisation d'un typedef vous aidera à rendre votre code plus clair en spécifiant ce que vous manipulez réellement, et il sera plus facile de changer de type lorsque vous vous rendrez compte des mois plus tard que votre choix initial était le plus mauvais. Il n'y a pas de "bonne réponse" ici, parce qu'on découvre généralement ces choses à la dure. L'interopérabilité entre une bibliothèque qui veut des uint32_t et une autre bibliothèque qui veut des ints est douloureuse.

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