67 votes

Existe-t-il des plates-formes où les pointeurs vers différents types ont des tailles différentes?

Le C standard permet des pointeurs vers les différents types de tailles différentes, par exemple, sizeof(char*) != sizeof(int*) est autorisée. Il exige toutefois que si un pointeur est convertie en void* puis de retour à son type d'origine, il faut comparer égale à sa valeur d'origine. Par conséquent, il s'ensuit logiquement que sizeof(void*) >= sizeof(T*) pour tous les types T, correct?

Sur la plupart des plates-formes communes en usage aujourd'hui (x86, PPC, ARM et 64 bits des variantes, etc.), la taille de tous les pointeurs est égale à la maternelle registre de taille (4 ou 8 octets), indépendamment de la pointe-de type. Il n'existe aucun ésotérique ou incorporés les plates-formes où les pointeurs de types différents peuvent avoir des tailles différentes? Je suis venu demander sur les données des pointeurs, bien que je serais aussi intéressé de savoir si il y a des plates-formes où la fonction pointeurs de taille anormale.

Je ne suis certainement pas en demandant au sujet de C++de pointeur-à-membres et pointeur-à-états-fonctions. Ceux prendre une taille inhabituelle sur des plates-formes communes, et peut même varier au sein d'une plate-forme, en fonction des propriétés de l'pointeur vers la classe (non polymorphes, seul héritage, l'héritage multiple, l'héritage virtuel, ou de type incomplète).

50voto

Robert S. Barnes Points 17244

Réponse de la FAQ C:

Le Premier de la série 50 utilisées segment 07777, décalage 0 pour le pointeur null, au moins pour PL/I. plus Tard, les modèles utilisés segment 0, offset 0 des pointeurs null en C, ce qui nécessite de nouvelles instructions comme TCNP (Test C Pointeur Null), de toute évidence comme une concession à tous les existants mal écrit le code en C qui fait des hypothèses erronées. Plus âgés, parole adressée Premier machines ont été également connus pour exiger plus d'octets pointeurs (char *s) que la parole, les pointeurs (int *').

L'Éclipse MV série de Données Général a trois architecturalement pris en charge pointeur de formats (word, byte et bit pointeurs), dont deux sont utilisés par les compilateurs C: octet des pointeurs de char * et void *, et de parole des pointeurs pour tout le reste. Pour des raisons historiques au cours de l'évolution de la 32-bits MV ligne à partir de la 16-bits de Nouvelle ligne, mot pointeurs et de l'octet les pointeurs avait le décalage, l'indirection, et l'anneau de protection de bits dans différents endroits de la parole. En passant un mauvais pointeur de format pour une fonction a entraîné des erreurs de protection. Finalement, le MV C compilateur ajoute de nombreuses options de compatibilité pour essayer de traiter avec le code qui avait pointeur incompatibilité de type d'erreurs.

Certains Honeywell-Bull mainframes utiliser le modèle de bits 06000 (interne) pointeurs null.

La CDC Cyber 180 Série a 48 bits pointeurs composé d'un anneau, segment, et le décalage. La plupart des utilisateurs (dans l'anneau 11) ont pointeurs null de 0xB00000000000. Il était courant sur les anciennes CDC ceux-complément de machines à utiliser une de tous les bits de mot comme un drapeau spécial pour tous les types de données, y compris les adresses invalides.

Le vieux HP de la série 3000 utilise un autre système d'adressage par octets d'adresses que pour word adresses; comme plusieurs des machines ci-dessus, il utilise donc des représentations différentes pour char * et non avenu * pointeurs que pour les autres indicateurs.

La Symbolique de la Machine Lisp, marqués de l'architecture, de ne même pas avoir conventionnelle numérique pointeurs; il utilise la paire (en gros une inexistant poignée) comme un C pointeur null.

Selon le `modèle de mémoire" en cours d'utilisation, 8086-famille des processeurs compatibles PC) peut utiliser les données 16-bit pointeurs 32 bits et des pointeurs de fonction, ou vice versa.

Quelque 64 bits Cray machines représentent int * dans les 48 bits d'un mot; char * de plus, utilise une partie de la partie supérieure de 16 bits pour indiquer une adresse de l'octet à l'intérieur d'un mot.

Autres liens: Un message de Chris Torek avec plus de détails sur certaines de ces machines.

33voto

Aric TenEyck Points 5434

Ce n’est pas tout à fait ce que vous demandez, mais à l’époque des jours DOS / Windows 16 bits, vous faisiez la distinction entre un pointeur et un pointeur éloigné, ce dernier étant en 32 bits.

J'ai peut-être une mauvaise syntaxe ...

 int *pInt = malloc(sizeof(int));
int far *fpInt = _fmalloc(sizeof(int));

printf("pInt: %d, fpInt: %d\n", sizeof(pInt), sizeof(fpInt));
 

Sortie:

pInt: 2, fpInt 4

14voto

Steve Jessop Points 166970

Par conséquent, il s'ensuit logiquement que sizeof(void*) >= sizeof(T*) pour tous les types T, n'est-ce pas?

Cela ne suit pas nécessairement, puisque sizeof concerne la représentation du stockage et que tous les modèles de bits ne doivent pas nécessairement être des valeurs valides. Je pense que vous pourriez écrire une implémentation conforme où sizeof(int*) == 8 , sizeof(void*) == 4 , mais il n’ya pas plus de 2 ^ 32 valeurs possibles pour un int *. Vous ne savez pas pourquoi vous voudriez.

13voto

Alex Martelli Points 330805

À l'époque dorée du DOS, du 8088 et de la mémoire segmentée, il était courant de spécifier un "modèle de mémoire" dans lequel, par exemple, tout le code pouvait tenir dans 64k (un segment), mais les données pouvaient couvrir plusieurs segments; cela signifiait qu'un pointeur de fonction aurait 2 octets, un pointeur de données, 4 octets. Je ne sais pas si quelqu'un programme encore pour des machines de ce type, peut-être que certaines survivent encore dans les utilisations intégrées.

7voto

dmckee Points 50318

On pourrait facilement imaginer une machine à architecture Harvard ayant différentes tailles pour les pointeurs de fonction et tous les autres pointeurs. Je ne connais pas d'exemple ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X