Pourquoi est-sizeof(int) différents que sizeof(int*)?
Je me demande pourquoi dans le programme suivant sizeof(int)
retourne une valeur différente de celle sizeof(int*)
.
Voici le petit programme:
int main(){
std::cout<<sizeof(int)<<endl;
std::cout<<sizeof(int*)<<endl;
return 0;
}
Et voici le résultat:
4
8
Jusqu'à maintenant je me souviens de la taille d'un pointeur entier est 4byte(compilateur gcc). Comment puis-je vérifier la bonne taille d'un pointeur? Est-elle dépendante de l'ordinateur?
Je suis sous ubuntu 12.04
# lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 12.04 LTS
Release: 12.04
Codename: precise
Est la taille du pointeur n'est pas constante(taille standard) 8 octets.
Système d'Exploitation 64 bits?
Êtes-vous sûr que tous les pointeurs sont garantis être de la même taille?
Pour info, il n'y a pas de "Taille Standard".
Les pointeurs de types différents n'ont pas à être de la même taille.
Charlesworth : Pourrais-je voir un exemple dans le code. Je ne suis pas trop sûr sur la question maintenant.
Êtes-vous sûr que tous les pointeurs sont garantis être de la même taille?
Pour info, il n'y a pas de "Taille Standard".
Les pointeurs de types différents n'ont pas à être de la même taille.
Charlesworth : Pourrais-je voir un exemple dans le code. Je ne suis pas trop sûr sur la question maintenant.
OriginalL'auteur yogi | 2012-06-11
Vous devez vous connecter pour publier un commentaire.
La taille d'un
int
et unint*
sont complètement compilateur et dépendant du matériel. Si vous êtes témoins de huit octets utilisés dans unint*
, vous avez probablement du matériel 64 bits, ce qui se traduit par huit octets par pointeur.Espérons que cette aide!
Je voudrais ajouter, que le seul type dont la taille est définie par la norme est
char
.sizeof(char)
est toujours1
De la taille d'un
char
n'est pas réellement définie par la norme, maissizeof
express résultats dans nombre de caractères.Je pense que c'était vrai avant C99 depuis C99 section 6.5.3.4 dit: "L'opérateur sizeof donne la taille (en octets) de son opérande".
À moins qu'ils ont fixé le nombre de bits dans un char (n'arrivera jamais)... un
char
est un byte, mais byte la taille est définie par l'implémentation.OriginalL'auteur templatetypedef
sizeof(char) == 1
Il n'y a pas d'autres garanties(*).
Dans la pratique, les pointeurs seront de taille 2 sur 16 bits, 4 sur un système 32 bits, et 8 sur un système 64 bits.
(*) Voir le commentaire de James Kanze.
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
est également garanti. Comme c'estsizeof(float) <= sizeof(double) <= sizeof(long double)
. (Il y a aussi une garantie que toutes les tailles sont partie intégrante, mais c'est plus ou moins bien compris.)Vouloir être pédant oui, bon commentaire. J'ai essayé d'écrire la réponse aussi claire que possible selon le type de question et de l'interlocuteur.
OriginalL'auteur gliderkite
La taille d'un pointeur est système, compilateur, et dépendants de l'architecture. Sur les systèmes 32 bits, il sera généralement en 32 bits alors que sur les systèmes 64 bits, ils seront généralement 64 bits.
Si vous essayez de stocker un pointeur vers un entier pour une restauration ultérieure dans le pointeur de nouveau, vous pouvez utiliser le type
intptr_t
qui est une partie intégrante de type assez grand (je crois) normal (non-fonction) de type pointeur.OriginalL'auteur Mark B
et
Voir ce question.
int8_t
etc. existent. Pour une portabilité maximale, il suffit d'utiliserint
, sauf si vous savez que vous avez besoin de quelque chose de plus grand, et de valider votre entrée.est assez standard. pubs.opengroup.org/onlinepubs/9699919799/basedefs/...
de série C et C++ en-tête dans lequel ces types sont définis, et dans
<stdint.h>
,int8_t
et coll. sont marquées comme étant facultatives. Dans la norme, je pense qu'ils sont "tenus" si le matériel prend en charge; c'est en tout cas l'intention. Mais ils doivent être à la taille exacte types et les types signés doivent être complément de 2. Sur les machines qui n'ont pas de 8 bits, octets, ou qui ne sont pas de complément de 2, ils ne sont pas définis. (Posix exige d'eux, ce qui limite le matériel sur lequel il peut être mis en œuvre.)Merci pour votre perspicacité.
OriginalL'auteur