Pourquoi est-int généralement de 32 bits sur 64 bits compilateurs?
Pourquoi est int
généralement de 32 bits sur 64 bits compilateurs? Quand j'ai commencé la programmation, j'ai appris int est généralement de la même largeur que l'architecture sous-jacente. Et je suis d'accord que cela fait sens, je trouve ça logique pour une quelconque largeur entier pour être aussi large que la plateforme sous-jacente (à moins que nous parlons de 8 ou 16 bits de machines, où une petite plage pour int
aura à peine le cas échéant).
Plus tard, j'ai appris int
est généralement de 32 bits sur la plupart des 64 bits plates-formes. Donc je me demande quelle est la raison de cette. Pour le stockage des données, je préfère explicitement largeur spécifiée pour le type de données, ceci laisse donc générique utilisation pour int
, qui n'offre pas d'avantages en termes de performances, au moins sur mon système, j'ai le même rendement à 32 bits et 64 bits des nombres entiers. Ce qui laisse le binaire de la mémoire, ce qui serait légèrement réduit, mais pas par beaucoup...
- Eh bien, c'est agréable d'avoir un type de chaque longueur en bits, n'est-ce pas? Malheureusement, alors
int
perd son statut de "natif de la longueur des mots de type". - Il y a longtemps de cela. Ensuite, long long
- Je recommande la lecture de ceci la réponse. La norme C++ exige seulement que, s'inscrit à l'intérieur d'une fourchette. 32 bits ajustement à l'intérieur de cette plage et à la mise en œuvre, s'ils en font un 32 bits ou 64 bits.
- vous pouvez également lire en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models.
- ... et int32_t, int64_t ....
- Vous n'aurez pas les mêmes performances pour les 32 bits et 64 bits des nombres entiers. Convertissez toutes vos données à partir de 32 à 64 bits, et vous avez doublé votre utilisation de la mémoire. Votre cache est seulement la moitié de l'utile maintenant.
- La question fondamentale est la suivante: 64 bits int-être plus rapide (sur 64 bits arc) de 32 bits?
- Je veux dire enregistrer les opérations, ils sont tout aussi vite, j'ai noté que l'empreinte mémoire est réduite.
- Vous devriez lire Ce que devrait être la sizeof(int) sur une machine 64 bits? et la taille d'un int dépend du compilateur et/ou le processeur?
- C'est vide de sens afin de discuter des résultats en ne considérant que le temps pris pour effectuer des opérations sur les registres. Les performances de la mémoire est souvent le chemin critique.
- Je ne serais même pas utiliser "souvent" - même L1 accès est lent par rapport à enregistrer des opérations, l'accès à la ram - énormément plus. Mais le scénario que j'ai utilisé pour les tests a cache et prefetch sympathique alors qu'il n'a pas la faveur des entiers 32 bits sur 64 à tous les...
- Le Cache est une mémoire trop. Une fois que votre problème de taille dépasse la taille du cache alors ce que vous dites n'est plus le cas. Les architectures et les langues n'ont pas été conçus pour résoudre votre problème spécifique. Ils sont conçus de manière générale. Et si le cache est un facteur limitant alors faire int 64 bits serait de la folie.
- mon point était que j'utilise rarement
int
pour les données réelles de stockage, je l'utilise pour les compteurs, qui sont créés sur le registre et n'a même jamais déplacé à la ram.
Vous devez vous connecter pour publier un commentaire.
Mauvais choix de la part des réalisateurs?
Au sérieux, selon la norme, la "Plaine ints ont l'
de taille naturelle suggéré par l'architecture de l'exécution
de l'environnement", ce qui ne signifie pas une 64 bits
int
sur un 64 bitsde la machine. On pourrait affirmer que tout le reste est
la non-conforme. Mais dans la pratique, les problèmes sont plus complexes:
commutation de 32 bits
int
à 64 bits,int
serait pas permettrela plupart des programmes pour gérer de grands ensembles de données ou que ce soit (contrairement à la
commutateur de 16 bits à 32); la plupart des programmes sont probablement
contraint par d'autres considérations. Et il serait d'augmenter l'
taille des ensembles de données, et donc de réduire la localité et de ralentir le
programme vers le bas.
Enfin (et probablement le plus important), si
int
étaient au nombre de 64 bits,short
devrait être de 16 bits ou32 bits, et vous'ld ont aucun moyen de préciser les autres (à l'exception
avec les typedefs dans
<stdint.h>
, et l'intention est que cesdoit être utilisé uniquement dans des circonstances très exceptionnelles).
Je soupçonne que cela a été la principale motivation.
int
était de 16 bits sur certains Motorola 68000, qui avait 32 bits registres, 16 bits interface de mémoire). Aujourd'hui, alors que c'est toujours l'interprétation la plus évidente, il y a beaucoup d'autres aspects à considérer.L'histoire, les arbitrages et les décisions sont expliquées par Le Groupe Ouvert à http://www.unix.org/whitepapers/64bit.html. Il couvre les différents modèles de données, leurs forces et faiblesses et les modifications apportées à la Unix spécifications pour accueillir l'informatique 64 bits.
int
s ont été de 32 bits sur les plus grandes architectures pour aussi longtemps que les modifier à 64 bits sera probablement causer plus de problèmes qu'elle n'en résout.int
de 16 à 32 bits, et il a pas causé de problèmes. Je ne vois pas où changerint
de 32 bits à 64 ans serait la cause des problèmes.int
être exactement 32 bits? Pour la plupart, j'imagine que le code est indifférent, tant que leint
peut contenir toutes les valeurs nécessaires.unsigned short x=-1;
, 32-bit compilateurs serait presque invariablement interpréterx*=x;
comme équivalent àx*=1u*x;
. La norme ne les oblige pas à le faire (par exemple code invoque un Comportement Indéfini), mais le compilateur auteurs ne voyait aucune raison de faire autre chose. Remplacerunsigned short
avecuint32_t
et les compilateurs modernes pour la version 64 bitsint
peut décider que, depuis le code ci-dessus s'appelle un Comportement Indéfini, il doit être inaccessible et par conséquent, le code suivant peut être ignoré.int
(qui est ce que les compilateurs ont généralement fait par défaut) ou de déclarer un __NON_MODULAIRE_COURT_ARITHMÉTIQUE macro donc le code nécessitant un tel comportement peut refuser de compilation. Pour l'instant il n'en est rien, cependant.Parce qu'il n'y a aucun avantage à beaucoup de logiciel pour avoir les entiers 64 bits.
À l'aide de 64 bits int pour calculer des choses qui peuvent être calculées dans un entier de 32 bits (et pour beaucoup de buts, des valeurs jusqu'à 4 milliards de dollars (+/- 2 milliards) sont suffisants), et de les rendre plus ne va pas aider à quoi que ce soit.
À l'aide d'un plus grand nombre entier ont cependant un effet négatif sur le nombre d'entiers de taille "choses" tient dans le cache du processeur. Afin de les rendre plus grand fera les calculs qui impliquent un grand nombre d'entiers (par exemple, des tableaux) prendre plus de temps parce que.
La
int
est la taille naturelle de la machine-le mot n'est pas quelque chose que stipulé par la norme C++. Dans les jours où la plupart des machines, 16 ou 32 bits, il est logique de le faire soit 16 ou 32 bits, parce que c'est un moyen très efficace de taille pour ces machines. Quand il s'agit de 64 bits machines, qui ne sont plus "aide". Afin de rester 32 bitsint
a plus de sens.Edit:
Fait intéressant, lorsque Microsoft a déménagé à 64 bits, ils n'ont même pas de
long
64 bits, car elle allait se briser trop de choses qui comptaient surlong
être une valeur de 32 bits (ou plus important encore, ils avaient un tas de choses qui comptaient surlong
être une valeur de 32 bits dans leur API, d'où parfois le logiciel client utiliseint
et parfoislong
, et ils ne voulaient pas qu'à la pause).long
dans leurs interfaces. Ils N'ontDWORD
, qui sans ambiguïté était de 32 bits. Mais il y avait beaucoup de code qui, à tort,long==DWORD==32 bits
.int
est la taille naturelle de la machine-le mot n'est pas quelque chose que stipulé par la norme C++": qu' §3.9.2?typedef
'd commelong int
.unsigned long==DWORD==32 bits
etlong==LONG==32 bits
sont des hypothèses erronées, pour la même raison: le type C utilisé est un détail d'implémentation, la largeur de la Windows SDK type est garanti.long int
peut également ne pas être le plus grand de taille que le processeur prend en charge.Raison principale est de compatibilité descendante. En outre, il existe déjà un entier de 64 bits type de
long
et va de même pour les types float:float
etdouble
. Modification de la taille de ces types de base pour les différentes architectures de vous présenter la complexité. En outre, un entier de 32 bits répond à de nombreux besoins en termes de gamme.int
encore en 16 bits?int
, et je suis conscient de plates-formes où il est de 16, 36 ou 48 bits et non 32.int
etlong
sont en 32 bits.long long
.int
etlong
? Je ne pense pas que vous aurez compris tout cela.int
devient 64 bits, le problème n'est pas ce quelong
oulong long
devenir (à la fois devenir 64 bits ainsi). Le problème est queshort
devient, 16 ou 32 bits. Et comment nous préciser les autres.int
etlong
32 bits.int
), et de 32 bits a été la plus grande taille directement pris en charge par le matériel. Pendant longtemps, les "classiques" des machines 16 bitsshort
, 32 bitslong
, et 16 ou 32 bitsint
, en fonction de l'architecture.Puisque personne ne l'a souligné encore.
int
est garantie entre -32767 à 32767(2^16
) Qui est requis par la norme. Si vous souhaitez prendre en charge 64 bits sur toutes les plateformes, je vous suggérons d'utiliser le bon typelong long
qui prend en charge (-9223372036854775807 à 9223372036854775807).int
est autorisé à être n'importe quoi tant qu'il fournit le minimum requis par la norme.long long
? Ne pas vous direint64_t
?int64_t
est facultatif,long long
ne l'est pas.Le C + + norme ne dit pas de combien de mémoire doit être utilisé pour le type int, vous indique la quantité de mémoire utilisée au moins pour le type int. Dans de nombreux environnements de programmation sur pointeur de 32 bits variables, "int" et "long" sont tous d'une longueur de 32 bits.