9
votes

Utilisation de 'Short' en C ++

Pourquoi est-ce que pour une entrée numérique que nous préférons un intégrement plutôt que court, même si l'entrée est de très peu d'entiers.

La taille du short est de 2 octets sur mes x86 et 4 octets pour INT, ne devrait-il pas être meilleur et plus rapide d'allouer que l'int?

ou je me trompe en disant que le court n'est pas utilisé?

c++

3 commentaires

L'âge est un mauvais exemple car il serait mieux stocké dans un type non signé. Être court ou int.


Et encore mieux serait de stocker leur date de naissance. Depuis un champ d'âge doit être maintenu en synchronisation


Je l'ai édité, devinez que cela devrait être ok maintenant :) Je suis d'accord que l'âge devrait être non signé, mais je cherchais juste une réponse à court v / s int.


5 Réponses :


19
votes

Les CPU sont généralement les plus rapides lorsqu'ils traitent de leur taille entière "natif". Donc, même si un court peut être plus petit qu'un int , le int est probablement plus proche de la taille natale d'un registre dans votre CPU et est donc susceptible d'être le plus efficace des deux.

Dans une architecture typique de processeur 32 bits, chargez une valeur de 32 bits nécessite un cycle de bus pour charger tous les bits. Chargement d'une valeur de 16 bits Nécessite un cycle de bus charger les bits, plus jetant la moitié d'eux (cette opération peut toujours se produire dans un cycle de bus).


9 commentaires

Il y a donc n'importe quel cas où une courte peut être utilisée? Je n'avais jamais pensé à cela aujourd'hui, puisque je suppose que nous sommes habitués à utiliser INT.


«Court» peut être utilisé pour les formats de fichier et les protocoles de réseau, où vous vous souciez de la quantité d'espace que vous utilisez.


Donc, si le chargement d'une valeur de 16 bits soit également effectué dans un cycle de bus, ce qui bénéficiera d'utiliser 32 bits.


Greg a dit qu'il mai se produit dans le même cycle - mais pas nécessairement. En outre, il s'agit d'une empreinte de cache de cache d'instructions plus importante.


Et si une structure composée de 2 shorts ou de 2 intens est alors meilleure et efficace alors?


@ Systèmes Roger ou intégré. Bien que je doute que quelqu'un va programmer un système intégré dans une langue haute (relativement) comme C ++.


@Vivek: dépend de l'utilisation.


Je ne sais pas vraiment où vous allez sur la chose "jetant la moitié des morceaux". X86 comporte au moins des instructions pour déplacer les valeurs 8 bits (MOVB) et 32 ​​bits (MOVL) et 32 ​​bits (MOVL) (MOVL) (MOVL), ainsi que des instructions pour déplacer une valeur 8 bits dans une largeur divers emplacements de mémoire (MOVZBL par exemple). Sur la plupart des architectures en utilisant toutes les données de la largeur natale de la CPU doivent exécuter à la même vitesse d'un point de vue du cycle de la CPU. Il existe une empreinte mémoire et des raisons d'alignement du cache Il peut être bénéfique d'aligner les données de différentes manières.


@Vivek - "Donc, si le chargement d'une valeur de 16 bits soit également effectué dans un cycle de bus, ce qui bénéficiera d'utiliser 32 bits" - à part le fait que vous pouvez stocker des nombres de magnitude beaucoup plus importants dans un int?



0
votes

Le type court est très utile si vous avez un grand tableau complet et Int est juste trop grand.

Étant donné que la matrice est assez grande, la sauvegarde de la mémoire sera importante (au lieu d'utiliser simplement un tableau d'INTS).

Les matrices Unicode sont également codées en short (bien que d'autres schémas d'encodage existent).

sur des dispositifs embarqués, l'espace reste important et courte pourrait être très bénéfique.

Dernier point mais non le moindre, certains protocoles de transmission insistent pour utiliser des shorts, de sorte que vous en avez toujours besoin là-bas.


4 commentaires

Unicode n'est pas codé comme court. Tout d'abord, vous envisagez de wchar_t , qui est un type distinct, et une seconde, l'encodage le plus courant est probablement utf-8 qui est d'octet. UTF16 est la valeur par défaut sur Windows, mais il est loin d'être "le" codage unicode. Et enfin, il y a aussi UTF32.


J'y pensais réellement à UTF16, qui est en fait une courte, même si vous pourriez nommer wchar_t. Ceci codant, généralement utilisé dans des représentations de mémoire. (Comme vous avez dit Windows l'utilise, Java l'utilise, etc.)


Les entiers 16 bits ne sont-ils pas chargés de 16 bits de rembourrage entre eux?


Sur certains processeurs, lorsque vous utilisez un entier 16 bits, il est traité dans un but général «registre» qui peut gérer 32 bits oas bien comme des nombres de 64 bits. Il décide simplement lorsqu'une opération sur un court-circuit est choisie pour prendre en compte les 16 bits inférieurs. Toutefois, en C ++, tout cela est inconnu du programmeur et un bref type de données est vraiment 16 bits sans rembourrage ni autres astuces.



13
votes

Un courte 16 bits est logique si vous gardez tant de en mémoire (dans un grand tableau, par exemple) que la réduction de 50% de taille ajoute à une réduction appréciable de la mémoire aérien. Ils sont pas plus rapides que les entiers 32 bits sur les processeurs modernes, comme Greg correctement souligné.


0 commentaires

1
votes

Dans les systèmes embarqués, le court et abrégé non signé Les types de données sont utilisés pour accéder aux éléments nécessitant moins de bits que l'entier natif.

Par exemple, si mon contrôleur USB dispose de 16 registres de 16 bits et que mon processeur a un entier 32 bits natif, j'utiliserais un abrégé non signé pour accéder aux registres (à condition que le non signé court Le type de données est de 16 bits).

La plupart des conseils des utilisateurs expérimentés (voir Actualités: Comp.lang.c ++. Modérée) consiste à utiliser la taille d'entier natif, à moins que un type de données plus petit soit utilisé. Le problème avec l'utilisation de court pour enregistrer la mémoire est que les valeurs peuvent dépasser les limites de courte . De plus, cela peut être une performance touchée sur certains processeurs 32 bits, car ils doivent aller chercher 32 bits près de la variable 16 bits et éliminer les 16 bits indésirables.

Mon conseil est de travailler en premier à la qualité de vos programmes et ne vous inquiétez que de l'optimisation si elle est justifiée et que vous avez du temps supplémentaire dans votre horaire.


1 commentaires

Je ne cherchais pas d'optimisation, j'étais juste curieux de savoir pourquoi short n'a jamais été utilisé. Et comme je ne pouvais trouver aucune raison convaincante partout où j'ai regardé, je pensais que la partie d'optimisation était le problème. Merci pour votre réponse, BTW.



1
votes

Utilisation de type court ne garantit pas que les valeurs réelles seront plus petites que celles de type int . Il permet pour qu'ils soient plus petits et garantissent qu'ils ne sont pas plus gros. Remarque aussi que court doit être supérieur ou égal à la taille de type char .

La question initiale ci-dessus contient des tailles réelles pour le processeur en question, mais lors du portage du code dans un nouvel environnement, on ne peut compter que sur des hypothèses faibles sans vérification des tailles définies par la mise en œuvre.

L'en-tête C - ou, de C ++, < / a> - définit les types de taille spécifiée, tels que uint8_t pour un type intégré non signé exactement huit bits de large. Utilisez ces types lorsque vous essayez de vous conformer au format spécifié à l'extérieur, tel qu'un protocole de réseau ou un format de fichier binaire.


2 commentaires

Vous devriez mentionner


Merci pour la suggestion. J'ai ajouté un autre paragraphe sur ce sujet.