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. P>
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? p>
ou je me trompe en disant que le court n'est pas utilisé? p>
5 Réponses :
Les CPU sont généralement les plus rapides lorsqu'ils traitent de leur taille entière "natif". Donc, même si un 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 em> jetant la moitié d'eux (cette opération peut toujours se produire dans un cycle de bus). P> court code> peut être plus petit qu'un
int code>, le
int code> 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. p>
Il y a donc n'importe quel cas i> 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 b> 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" i> - à part le fait que vous pouvez stocker des nombres de magnitude beaucoup plus importants dans un int?
Le type court est très utile si vous avez un grand tableau complet et Int est juste trop grand. P>
É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). P>
Les matrices Unicode sont également codées en short (bien que d'autres schémas d'encodage existent). P>
sur des dispositifs embarqués, l'espace reste important et courte pourrait être très bénéfique. P>
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. P>
Unicode n'est pas codé comme court. Tout d'abord, vous envisagez de wchar_t code>, 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.
Un courte 16 bits est logique si vous gardez tant de em> 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 em> plus rapides que les entiers 32 bits sur les processeurs modernes, comme Greg correctement souligné. P>
Dans les systèmes embarqués, le
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
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 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. P> court code> 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. P>
abrégé non signé code> pour accéder aux registres (à condition que le
non signé court Code> Le type de données est de 16 bits).
p>
court code> pour enregistrer la mémoire est que les valeurs peuvent dépasser les limites de
courte code>. 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.
p>
Je ne cherchais pas d'optimisation, j'étais juste curieux de savoir pourquoi short i> 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.
Utilisation de type 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 em> em> sans vérification des tailles définies par la mise en œuvre. p>
L'en-tête C court code> ne garantit pas que les valeurs réelles seront plus petites que celles de type
int code>. Il permet em> pour qu'ils soient plus petits et garantissent qu'ils ne sont pas plus gros. Remarque aussi que
court code> doit être supérieur ou égal à la taille de type
char code>. P>
uint8_t code> 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. P>
Vous devriez mentionner
Merci pour la suggestion. J'ai ajouté un autre paragraphe sur ce sujet.
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.