web-dev-qa-db-fra.com

Quand utiliser «short» sur «int»?

De nombreuses questions demandent des différences entre les types entiers short et int en C++, mais en pratique, quand choisissez-vous short plutôt que int?

29
dayuloli

(Voir réponse d'Eric pour une explication plus détaillée)

Remarques:

  • Généralement, int est défini sur la 'taille naturelle' - la forme entière que le matériel gère le plus efficacement
  • Lorsque vous utilisez short dans un tableau ou dans des opérations arithmétiques, l'entier short est converti en int, ce qui peut donc influer sur la vitesse de traitement short entiers
  • L'utilisation de short peut économiser de la mémoire si elle est plus étroite que int, ce qui peut être important lors de l'utilisation d'un grand tableau
  • Votre programme utilisera plus de mémoire dans un système int 32 bits par rapport à un système int 16 bits

Conclusion:

  • Utilisez int sauf si la conservation de la mémoire est critique ou si votre programme utilise beaucoup de mémoire (par exemple, de nombreux tableaux). Dans ce cas, utilisez short.
36
dayuloli

Vous choisissez short sur int lorsque:

Soit

  • Vous souhaitez réduire l'empreinte mémoire des valeurs que vous stockez (par exemple, si vous ciblez une plate-forme à faible mémoire),
  • Vous souhaitez augmenter les performances en augmentant le nombre de valeurs pouvant être regroupées dans une seule page de mémoire (réduction des défauts de page lors de l'accès à vos valeurs) et/ou dans les caches de mémoire (réduction des erreurs de cache lors de l'accès aux valeurs), et le profilage a révélé qu'il y a des gains de performance à réaliser ici,
  • Ou vous envoyez des données sur un réseau ou les stockez sur disque, et souhaitez réduire votre empreinte (pour occuper moins d'espace disque ou de bande passante réseau). Bien que dans ces cas, vous devriez préférer les types qui spécifient exactement la taille en bits plutôt que int ou short, qui peuvent varier en fonction de la plate-forme (comme vous voulez une plate-forme avec un _ 32 bits short pour pouvoir lire un fichier écrit sur une plateforme avec un short) 16 bits. Les bons candidats sont les types définis dans stdint.h .

Et:

  • Vous avez une valeur numérique qui n'a pas besoin de prendre de valeurs qui ne peuvent pas être stockées dans un short sur votre plate-forme cible (pour un _ 16 $ short, c'est -32768-32767, ou 0-65535 pour un 16 bits unsigned short).
  • Votre plate-forme cible (ou l'une de vos plates-formes cibles) utilise moins de mémoire pour un short que pour un int. La norme garantit seulement que short est pas plus grand que int, donc les implémentations sont autorisées à avoir la même taille pour un short et pour un int.

Remarque:

chars peut également être utilisé comme type arithmétique. Une réponse à "Quand devrais-je utiliser char au lieu de short ou int?" se lirait de manière très similaire à celle-ci, mais avec numéros différents (-128-127 pour un _ 8 $ char, 0-255 pour un 8 bits unsigned char)

En réalité, vous ne voulez probablement pas utiliser spécifiquement le type short. Si vous voulez un entier de taille spécifique, il existe des types définis dans <cstdint> qui devrait être préféré, comme, par exemple, un int16_t sera de 16 bits sur chaque système, alors que vous ne pouvez pas garantir que la taille d'un short sera la même pour toutes les cibles pour lesquelles votre code sera compilé.

17
Eric Finn

En général, vous ne préférez pas short à int.

Le type int est la taille Word native du processeur
Habituellement, un int est la taille Word du processeur.

Par exemple, avec un processeur de taille de mot 32 bits, un int serait de 32 bits. Le processeur est plus efficace en utilisant 32 bits. En supposant que short est de 16 bits, le processeur récupère toujours 32 bits de la mémoire. Donc pas d'efficacité ici; en fait, c'est plus long car le processeur peut avoir à décaler les bits à placer dans la bonne position dans un mot 32 bits.

Choix d'un type de données plus petit Il existe des types de données normalisés de longueur spécifique au bit, tels que uint16_t. Ceux-ci sont préférés aux types ambigus de char, short, et int. Ces types de données spécifiques à la largeur sont généralement utilisés pour accéder au matériel ou pour compresser l'espace (comme les protocoles de message).

Choisir une gamme plus petite
Le type de données short est basé sur plage et non sur la largeur de bits. Sur un système 32 bits, short et int peuvent avoir la même longueur 32 bits.

Une fois que la raison d'utiliser short est parce que la valeur ne dépassera jamais une plage donnée. Il s'agit généralement d'une erreur car les programmes changeront et le type de données pourrait déborder.

Résumé
Actuellement, je n'utilise plus short. J'utilise uint16_t lorsque j'accède à des périphériques matériels 16 bits. J'utilise unsigned int pour les quantités, y compris les indices de boucle. J'utilise uint8_t, uint16_t et uint32_t lorsque la taille est importante pour le stockage des données. Le type de données short est ambigu pour le stockage de données, car il s'agit d'un minimum. Avec l'avènement des fichiers d'en-tête stdint, il n'y a plus besoin de short.

8
Thomas Matthews

Si vous n'avez pas de contraintes spécifiques imposées par votre architecture, je dirais que vous pouvez toujours utiliser int. Le type short est destiné à des systèmes spécifiques où la mémoire est une ressource précieuse.

0
Zaphod Beeblebrox