sizeof(long) en C++64 bits
J'ai téléchargé MinGW-64, donc je peux maintenant compiler des programmes 64 bits pour Windows 7, l'utilisation de g++ 4.7.0 (expérimental). Mais la ligne suivante:
cout << sizeof(long) << " " << sizeof(void*) << endl ;
imprime 4 8
, pas 8 8
. La documentation de g++ 4.6.0 dit:
L'environnement 64 bits jeux de int de 32 bits et une longue et pointeur vers 64 bits
Quelqu'un sait pourquoi sizeof(long)
n'est pas 8?
Modifiées afin d'ajouter: La source de ma confusion vient du fait que g++ 4.7.0 pour la version 64 bits de Windows n'est pas (encore) une partie officielle de la GNU compiler Collection. Et c'est le premier de 64 bits version à 32 bits long
, de sorte que la documentation n'a tout simplement pas s'appliquer à elle. En effet, si vous allez à la page web, l'entrée pour IA-32/x86-64 consiste en ceci:
...
- Ressemble à quelqu'un juste en série downvoted la moitié des réponses sans laisser de commentaires...
- Et ma question trop!
- Si vous avez besoin d'une version 64 bits de large integer utiliser le int64_t/un uint64_t ou définir votre propre. De cette façon, votre code sera portable et de ne pas compter sur la plate-forme de détails pour que l'int/long/short tailles.
- c'est
long long
dans g++. - TonyK je préfère utiliser le type de l'en-tête si disponible, ou un rouleau de mon propre si pas.
Vous devez vous connecter pour publier un commentaire.
Parce qu'il n'a pas à être. La norme C++ exige seulement que c'est (si ma mémoire est bonne) au moins 32 bits de large, et au moins aussi grand que
int
.MSVC (et l'ABI utilisé par Windows) définit
long
à 32 bits de large, et MingW suit parce que bon, le compilateur est beaucoup plus utile quand il est d'accord avec l'OS hôteSur le système d'exploitation microsoft windows que vous avez LLP64 de sorte que la taille de long est de 32 bits. (voir le tableau ci-dessous)
Citation de wikipedia:
Dans les programmes 32 bits, les pointeurs et types de données tels que les entiers ont généralement la même longueur; ce n'est pas forcément le cas sur les ordinateurs 64 bits.
Le mélange des types de données dans les langages de programmation tels que C et de ses descendants, tels que C++ et Objective-C peut ainsi fonctionner sur 32 bits implémentations, mais pas sur 64 bits implémentations.
Dans de nombreux environnements de programmation en C et C-langages dérivés sur les ordinateurs 64 bits, "int", les variables sont toujours 32 bits, mais entiers longs et les pointeurs sont des 64 bits de large.
Ces derniers sont décrits comme ayant une LP64 modèle de données. Une autre alternative est le ILP64 modèle de données dans laquelle tous les trois types de données sont 64 bits, et même SILP64 où "court" entiers sont aussi 64 bits de large.
Cependant, dans la plupart des cas, les modifications nécessaires sont relativement mineures et simple, et de nombreux programmes écrits peuvent simplement être recompilé pour le nouvel environnement sans modifications.
Une autre alternative est le LLP64 modèle, qui maintient la compatibilité avec les versions 32 bits de code en laissant les deux int et long sur 32 bits. "LL" se réfère à la "long entier long", qui est au moins 64 bits sur toutes les plateformes, y compris les environnements 32 bits.
long
taille est de 64 bits ont un 64 bitslong
.LLP64
moyens. 😉 Mais vous pouvez simplement éditer ton post pour ajouter pertinentes de l'explication. 🙂int32_t
être défini comme dans ILP64? Ouint16_t
dans SILP64?int16_t
sont exacte de la largeur des types, c'est à dire, ils sont exactement ce que la largeur ou elles n'existent pas. Il y a en outreint_fast*_t
etint_least*_t
types qui sont à moins que la largeur, mais peut-être plus. Sur SILP64 il est probable que tous ces minimum de largeur de types serait de 64 bits. (Necroposting, oui. =)MinGW est conçu pour construire une application WIN32 WIN32 en-têtes et les bibliothèques suppose la longue(ou LONGUE) de type 32 bits, même sur un 64 bits de Windows.
Microsoft a décidé que sinon autant des Fenêtres existantes codes source qui doit être changé. Par exemple, la structure suivante utilise de LONGS types.
;
LONG
est juste une macro. Il peut être facilement modifié pourint32_t
, donc ce n'est pas une raison valable.MinGW est conçu pour construire des applications Windows, et la plate-forme Microsoft ABI spécifie que
int
etlong
ont la même taille de 32 bits. Si MinGW définilong
différemment de MSVC, la plupart des applications Windows qui utilisentlong
allait se briser lorsqu'il est compilé avec MinGW.Après avoir dit que, Cygwin x86_64 suivre le LP64 convention sur Windows comme sur Linux (source).
De sorte que vous pouvez l'utiliser pour construire une application Windows, où la taille des
long
est de 8 octets 🙂Cas de Test:
Compiler avec:
C:\cygwin64\bin\gcc.exe -mwindows -m64 cygwin-test.c -o cygwin-test
De sortie:
C'est spécifique au système d'exploitation. Windows a encore de la taille de longs égalité de 32 bits
La plupart des applications Windows sont écrits avec l'espoir que pour toutes fins utiles, int=long=32 bits. Je devine que MinGW est juste pour s'assurer que c'est toujours le cas et il n'y a pas de surprises.