Quels sont les systèmes là-bas utilisent la représentation de pointeur non uniforme? [dupliquer]

StackOverflow https://stackoverflow.com/questions/3860593

Question

  

Possible en double:    Est-ce il y a des plates-formes où pointeurs vers différents types ont des tailles différentes?

J'ai lu à plusieurs endroits que les pointeurs de différents types peuvent avoir différentes représentations dans les implémentations conformes au standard C. C'est une chose qui rend nécessaire aux arguments pointeur de la fonte à printf, par exemple.

int foo;
printf("address is %p\n", (void *) &foo);

J'étais sceptique cela et attisé par la norme C99 (document GT14 N1256, disponible sur http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf ). A 6.2.5.27 il lit comme suit:

  

Un pointeur à vide a les mêmes exigences de représentation et d'alignement en tant que   pointeur vers un type de caractère. De même, des pointeurs vers des versions qualifiées ou non qualifiées de   types compatibles ont les mêmes exigences de représentation et d'alignement. Tous les pointeurs vers des types de structure ont la même représentation et les exigences d'alignement   que l'autre. Tous les pointeurs vers les types syndicaux ont la même représentation et   les exigences d'alignement que l'autre. Pointeurs à d'autres types ne doivent pas avoir la même   exigences en matière de représentation ou d'alignement.

Alors, il ne semble en effet comme une mise en œuvre conforme C99 pourrait utiliser différentes représentations pour les pointeurs de différents types.

Ma question est la suivante: ce que les implémentations C / architectures existent qui utilisent effectivement différentes représentations pour les pointeurs de différents types

Était-ce utile?

La solution

Classique Cray (ne sais pas au sujet de leurs nouveaux produits) ne pouvait pas les caractères d'adresse avec des pointeurs réguliers, donc char* et donc void* étaient différents des pointeurs de vecteur natif.

(commentaire de Voir Keith ci-dessous, cependant. Il aurait pu être différent ABI en cours d'utilisation, et en faisant tourner les l'adresse d'ordre inférieur bits à la fin d'ordre supérieur, ils ne font parfois les « petits » et des pointeurs « grossiers » compatible à un degré.)

Autres conseils

Probablement le plus connu est le mode réel des processeurs x86, ce qui pourrait avoir des pointeurs de données 16 bits et des pointeurs de fonction 32 bits en fonction du modèle de mémoire que vous avez choisi (ou vous pourriez avoir des pointeurs de données 32 bits avec 16- pointeurs de fonction binaire, ou quelque chose de différent encore une fois ...).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top