Est la sizeof(certains pointeur) toujours égal à quatre?
Par exemple:
sizeof(char*)
renvoie 4. Comme int*
, long long*
, tout ce que j'ai essayé. Existe-il des exceptions?
- Pourquoi cette marque vers le bas? Bonne question pour les débutants.
- Je soupçonne qu'une autre question se cache dans celui-ci: "qu'est-Ce que sizeof?" ou peut être "Pourquoi est-sizeof <un pointeur> == 4? Quel est si spécial à propos de 4?". Suis-je le droit?
- Eh bien, cela dépend de votre plate-forme. La plupart des implémentations de partager une même taille pour chaque type de pointeur sur une plate-forme spécifique.
Vous devez vous connecter pour publier un commentaire.
La garantie que vous obtenez est que
sizeof(char) == 1
. Il n'y a pas d'autres garanties, y compris aucune garantie quesizeof(int *) == sizeof(double *)
.Dans la pratique, les pointeurs seront de taille 2 sur 16 bits (si vous pouvez en trouver un), 4 sur un système 32 bits, et 8 sur un système 64 bits, mais il n'y a rien à gagner en s'appuyant sur une taille donnée.
sizeof(int) <= sizeof(long)
. Ils peuvent être les mêmes oulong
pourrait être considérablement plus grande queint
, mais ce ne sera jamais plus petit.sizeof(char*) == sizeof(void*)
?sizeof(char*) == sizeof(void*)
. Hâte de savoir vos pensées sur cela.Même sur une plaine x86 32 bits plate-forme, vous pouvez obtenir une variété de pointeur de tailles, essayez ceci pour un exemple:
Sous Visual C++ 2008, je reçois 4, 12 et 8 pour la taille des pointeurs-à-membres de la fonction.
Raymond Chen a parlé de ce ici.
Juste une autre exception à la déjà posté la liste. Sur les plates-formes 32 bits, les pointeurs peut prendre 6, pas 4, octets:
Si vous compilez ce programme avec l'Open Watcom et l'exécuter, vous aurez 6, parce que loin des pointeurs qu'il prend en charge se composent de 32 bits décalage de 16 bits et le segment de valeurs
far
est non-standard.si vous compilez pour une machine 64 bits, alors il peut être 8.
size(char)==1
?Techniquement parlant, la norme ne garantit que sizeof(char) == 1, et le reste est à la mise en œuvre. Mais sur le moderne, les architectures x86 (par exemple Intel/AMD, puces), il est assez prévisible.
Vous avez probablement entendu parler des processeurs décrit comme étant de 16 bits, 32 bits, 64 bits, etc. Généralement, cela signifie que le processeur utilise N-bits pour les entiers. Puisque les pointeurs de stocker en mémoire les adresses et les adresses mémoire sont des nombres entiers, effectivement cela vous indique combien de bits sont utilisés pour les pointeurs. sizeof est généralement mesurée en octets, de sorte que le code compilé pour les processeurs 32 bits rendra compte de la taille des pointeurs à 4 (32 bits /8 bits par octet), et le code pour les processeurs 64 bits, fera rapport à la taille des pointeurs à 8 (64 bits /8 bits par octet). C'est là que la limitation de 4 GO de RAM pour les processeurs 32 bits proviennent -- si chaque adresse mémoire correspond à un octet, d'adresser plus de mémoire vous avez besoin des entiers de plus de 32-bits.
En plus de la 16/32/64 peu de différences, même étrangeté des choses peuvent se produire.
Il y a eu des machines où sizeof(int *) sera une valeur, probablement 4 mais où sizeof(char *) est plus grande. Les Machines qui naturellement adresse des mots au lieu de les octets à "augmenter" pointeurs de caractère pour spécifier quelle partie du mot que vous voulez vraiment dans le but de mettre en œuvre correctement le C/C++ standard.
C'est maintenant très rare que les concepteurs de matériel ont appris la valeur de l'octet de l'adressabilité.
void*
etchar*
sont traitées dans le logiciel, et sont complétées avec un décalage 3 bits dans le mot, mais depuis il n'y a pas en fait d'une version 64 bits de l'adresse de l'espace, le décalage est stocké dans les 3 bits de la version 64 bits du mot. Doncchar*
etint*
sont de la même taille, mais ils ont d'autres représentations internes -- et le code qui suppose que les pointeurs sont "vraiment" juste les nombres entiers peuvent échouer mal.La taille du pointeur dépend fondamentalement de l'architecture du système dans lequel il est mis en œuvre. Par exemple, la taille d'un pointeur de 32 bits soit 4 octets (32 bits ) et de 8 octets(64 bits ) en 64 bits machines. Le peu de types dans une machine ne sont rien, mais l'adresse de mémoire, qu'il peut avoir. 32 bits machines peuvent avoir
2^32
espace d'adressage et 64 bits des machines peut avoir jusqu'à2^64
espaces d'adressage. Donc un pointeur (variable qui pointe vers un emplacement de la mémoire) devrait être en mesure de tout de l'adresse mémoire (2^32 for 32 bit and 2^64 for 64 bit
), que des machines détient.À cause de cette raison, nous voyons la taille d'un pointeur de 4 octets ordinateur 32 bits et 8 octets dans un ordinateur 64 bits.
8 bits et 16 bits pointeurs sont utilisés dans la plupart de profil bas microcontrôleurs. Cela signifie que chaque machine à laver, d'un micro, d'un réfrigérateur, les anciens Téléviseurs, et même des voitures.
On peut dire qu'ils n'ont rien à voir avec le monde réel de la programmation.
Mais en voici un exemple réel:
Arduino avec 1-2-4k de ram (selon chip) avec 2 octets pointeurs.
C'est récent, bon marché, accessible pour tout le monde et les valeurs de codage pour.
En plus de ce que les gens ont dit à propos de 64 bits (ou autre) des systèmes, il existe d'autres types de pointeur de pointeur vers l'objet.
Un pointeur vers membre pourrait être presque n'importe quelle taille, selon la façon dont ils sont mis en œuvre par votre compilateur: ils ne sont même pas nécessairement tous de la même taille. Essayez un pointeur vers membre d'une GOUSSE de classe, et puis un pointeur vers membre hérité de l'une des classes de base d'une classe avec plusieurs bases. Quel plaisir.
De ce que je me souviens, il est basé sur la taille d'une adresse de mémoire. Ainsi, sur un système avec une adresse 32 bits régime, sizeof sera de retour le 4, car c'est 4 octets.
sizeof (unsigned int) == sizeof (signed int)
, cette exigence est trouvé dans 3.9.1/3. "Pour chacun de la norme entier signé types, il existe un correspondant (mais différentes) standard type entier non signé:unsigned char
,unsigned short int
,unsigned int
,unsigned long int
, etunsigned long long int
, dont chacun occupe la même quantité de stockage et a le même alignement exigences correspondantes entier signé de type"En général, sizeof(à peu près tout) va changer lorsque vous compilez sur différentes plates-formes. Sur un 32 bits plate-forme, les pointeurs sont toujours de la même taille. Sur d'autres plates-formes (64 bits étant l'exemple le plus évident), cela peut changer.
Non, de la taille d'un pointeur peut varier en fonction de l'architecture. Il existe de nombreuses exceptions.
Taille du pointeur et l'int est de 2 octets Turbo C compilateur sous windows 32 bits de la machine.
Donc taille du pointeur est compilateur spécifique. Mais en général, la plupart des compilateurs sont mis en œuvre à l'appui de pointeur de 4 octets variable en 32 bits et 8 octets pointeur de variable en machine 64 bit).
Donc taille du pointeur n'est pas la même dans toutes les machines.
Dans Win64 (Cygwin GCC 5.4), nous allons voir l'exemple ci-dessous:
D'abord, tester la structure suivante:
Le code de test est ci-dessous:
La sortie est ci-dessous:
Vous pouvez voir qu'en 64 bits,
sizeof(pointer)
est8
.La raison de la taille de votre pointeur est de 4 octets est parce que vous êtes compilation pour une architecture 32 bits. Comme FryGuy souligné, sur une architecture 64 bits, vous verriez 8.
Un pointeur est un conteneur pour une adresse. Sur un ordinateur 32 bits, votre plage d'adresses de 32 bits, donc un pointeur sera toujours 4 octets. Sur un ordinateur 64 bits ont été vous avez une adresse de gamme de 64 bits, un pointeur sera de 8 octets.
Juste pour l'exhaustivité et l'intérêt historique, dans le 64bit monde, il y avait différentes plate-forme de conventions sur les tailles de long et long long types, nommé LLP64 et LP64, principalement entre les systèmes de type Unix et Windows. Un vieux standard nommé ILP64 également fait int = 64 bits de large.
Microsoft maintenu LLP64 où longlong = 64 bits de large, mais longtemps resté à 32, pour faciliter le portage.
Source: https://stackoverflow.com/a/384672/48026