Récemment je lui ai répondu une autre question demandant Questions Chaque programmeur décent C ++ devrait pouvoir répondre à em> . Ma suggestion Was < pre> XXX pre>
R .. désapprouve avec l'AI propose au Q - dit-il que la bonne réponse serait "il est spécifique à la mise en œuvre". Tandis que les implémentations actuelles stockent des adresses numériques comme des pointeurs, il n'y a aucune raison pour ne pas être quelque chose de beaucoup plus élaboré em>. P> Je ne peux certainement pas être en désaccord qu'il pourrait être em> autres implémentations sauf mémoriser une adresse juste pour le plaisir d'être en désaccord. Je suis vraiment intéressé ce que d'autres implémentations vraiment utilisées sont là. P> Quelles sont les autres implémentations réellement utilisées de pointeurs en C ++, sauf mémoriser une adresse dans une variable de type entier? Comment le casting (en particulier dynamic_cast code>) implémenté? P> p>
6 Réponses :
Sur un niveau conceptuel, je suis d'accord avec vous - je définis l'adresse d'un objet comme "les informations nécessaires pour localiser l'objet en mémoire". À quoi ressemble l'adresse, cependant, peut varier un peu. P>
Une valeur de pointeur Ces jours-ci sont généralement représentés comme une adresse simple et linéaire ... mais il y a eu des architectures où le format d'adresse n'est pas aussi simple, ou varie en fonction du type. Par exemple, programmation en mode réel sur un X86 (par exemple sous DOS), vous devez parfois stocker l'adresse comme segment: Paire offset. P>
voir http://c-faq.com/null/machexamp.html pour d'autres exemples. J'ai trouvé la référence à la machine symbolique LISP intrigante. P>
Me rappelle des pointeurs de loin quand j'ai fait de la programmation en mode réel de quelques années. Bons moments ... l'adressage linéaire est tellement ennuyeux :)
En réalité, le segment: l'adressage offset a également été utilisé dans le système d'exploitation 16 bits (versions 1.x). Ce système d'exploitation était basé sur l'Intel 80286, qui a pris en charge "mode protégé" avec adressage physique 24 bits et 16:16 (sélecteur: décalage) adressage logique où la partie sélecteur pointée sur des descripteurs de segment, indirectant aux adresses physiques.
Les pointeurs intelligents sont les pointeurs em> Les pointeurs em> aux fonctions de membre non statiques peuvent être des structures complexes, contenant des informations sur les tables de fonctions virtuelles. P> Itérateur est un pointeur générique em>. P> Une question probablement correcte devrait ressembler à: p>
Le pointeur intelligent stocke généralement un pointeur habituel de toute façon. Pourriez-vous fournir plus de détails sur la manière dont les pointeurs des membres contiennent des informations sur les vtables?
Les pointeurs intelligents ne sont qu'une classe d'envelopper un pointeur standard. Les itérateurs sont un typedef. Les deux finissent par être une adresse stockée, qui a une utilisation et des effets d'exécution différentes.
@shaparptooth Oui, les pointeurs intelligents contiennent une valeur de type T *, mais toutes ne sont pas toutes d'adresses de mémoire. Différents compilateurs utilisent différentes techniques pour gérer les fonctions virtuelles. Il n'y a pas de réponse courante, certains compilateurs n'utilisent pas du tout des vtales. Lisez la documentation de votre compilateur.
@Matthew Iselin: Habituellement, Itérateur est une classe avec des opérateurs surchargés et dans certains cas rares, c'est un typdef, pour augmenter les performances.
ah, bien sûr. Vendredi après-midi fait des choses étonnantes à son cerveau :)
J'appellerais in Par conséquent, les pointeurs de interprocession ne sont pas représentés comme des adresses, mais ils peuvent être résolus comme un. P>
Merci d'avoir regardé: -) p> boost.interprocess code> comme témoin. P>
boost.interprocess code> Les pointeurs de interprotisme sont compensés depuis le début de la zone de mémoire mappée. Cela permet d'obtenir le pointeur d'un autre processus, carapez la zone de mémoire (quelle adresse du pointeur peut être différente de celle du processus qui a passé le pointeur) et accédez toujours au même objet. P>
Une merci sincère bienvenue à La Ligue des contributeurs extraordinaires C ++ ! :-)
@James McNellis: Cela signifie-t-il que je suis condamné: x?
Vous pouvez utiliser des pointeurs de segmentation, Bancialement, vous avez divisé la mémoire en blocs d'une taille fixe (petite) puis divisez-le en segments (de grandes collections de blocs), de taille fixe également, ainsi qu'un pointeur sur un objet peut être stocké comme SEG : Bloc. Ainsi, dites que nous avons le pointeur 2: 5 code>, chaque segment est de 7 blocs, chaque bloc est de 32 octets, puis
2: 5 CODE> peut être traduit en un pointeur de type X86 en effectuant
(((2 - 1) * (7 * 32)) + (5 * 32) code>, qui yeilds
0x180 code> à partir du début du premier segment fort> p> p>
Si nous connaissons l'accès des éléments de tableau à l'aide de pointeur arithmétique, il est facile de comprendre comment les objets sont posés en mémoire et comment supposons que donc du code pour accéder à la Les champs deviendront essentiellement accès aux éléments de matrice à l'aide du pointeur arithmétique: p> si la langue prend en charge une sorte de gestion automatique de la mémoire, comme GC, des champs supplémentaires peuvent être ajoutés à la Array d'objet em> Derrière la scène. Imaginez une implémentation C ++ qui recueille des ordures à l'aide de la comptage de référence. Ensuite, le compilateur peut ajouter un champ supplémentaire (RC) à garder une trace de ce nombre. La représentation de la matrice ci-dessus devient alors: la première cellule pointe à l'adresse du nombre de références. Le compilateur émettra le code approprié pour accéder aux parties de maintenant il est facile de comprendre comment un objet de Considérons maintenant ce qui va se passer lorsque nous essayons de jeter une fenêtre code> A code> A dynamic_cast code> fonctionne. Considérons la classe simple suivante:
p code> est attribué à l'emplacement de la mémoire
0x01 code>. Ses variables de membre sont stockées dans leurs propres emplacements disparates, disent
x _ code> sont stockés sur
0x04 code> et
y _ _ code> au
0x07 code>. Il est plus facile de visualiser l'objet
p code> comme une éventail de pointeurs.
p code> (dans notre cas (
0x1 code>) pointe au début de la matrice: p>
P code> qui doivent être visibles pour le monde extérieur: p>
dynamic_cast cod> fonctionne. Compiler traite des classes polymorphes en ajoutant un pointeur à caché supplémentaire au sous-jacent représentation. Th Est-ce que le pointeur contient l'adresse du début d'un autre "tableau" appelé le gisible em>, qui contient à son tour les adresses des implémentations de fonctions virtuelles dans cette classe. Mais la première entrée de gisible em> est spéciale. Il ne pointe pas d'une adresse de fonction mais à un objet d'une classe appelée
type_info code>. Cet objet contient les informations de type d'exécution de l'objet et des pointeurs sur
type_info code> S de ses classes de base. Considérons l'exemple suivant: p>
fenêtre code> aura la disposition de la mémoire suivante: p>
image * code>: p>
// no virtual functions
class A
{
};
class B
{
public:
virtual void f() = 0;
};
class C : public A, public B
{
virtual void f() { }
};
C* c = new C;
A* a = dynamic_cast<A*>(c); // OK
Les pointeurs sur des objets stockent (représentations de) ce que C ++ appelle des "adresses". 3.9.2 / 3, "Une valeur valide d'un type de pointeur d'objet représente l'adresse d'un octet en mémoire (1.7) ou un pointeur null (4.10)." P>
Je pense qu'il est juste de dire par conséquent qu'ils "stockent" des adresses, c'est juste que cela dit que cela ne transmet pas beaucoup. C'est juste une autre façon de dire quels pointeurs sont em>. Ils peuvent également stocker d'autres informations, et ils peuvent stocker l'adresse numérique physique / virtuelle réelle en se référant à une autre structure ailleurs, mais en termes de sémantique C ++, une variable de pointeur contient une adresse. P>
Abyx lève le problème que seuls les pointeurs d'objet et de fonction représentent des adresses. Les pointeurs-à-membres ne représentent pas nécessairement une adresse, en tant que telle. Mais la norme C ++ stipule spécifiquement que le mot "pointeurs" dans la norme ne doit pas être pris pour inclure des pointeurs-à-membres. Donc, vous ne pouvez pas compter cela. P>
Autre que segment: Décalage (ce qui est évidemment une adresse composée de deux nombres), le "pointeur drôle" le plus plausible que je puisse penser serait celui dans lequel certaines informations de type figurent dans le pointeur. Il est peu probable que vous souhaitiez optimiser diabolique RTTI au coût de réduction de l'espace que vous pouvez aborder, mais vous ne savez jamais. P>
Une autre possibilité est que si vous impliez une poubelle collectée C ++, alors chaque pointeur pourrait stocker des informations sur la pile ou le tas, et peut-être que vous pourriez peut-être vous faufiler dans certaines informations pour vous aider avec un marquage précis ou conservateur. < / p>
Je n'ai pas rencontré personne qui fait de ces choses avec des pointeurs en C ++, cependant, je ne peux donc pas garantir leur suffisamment d'utilisations. Il existe d'autres moyens de stocker des informations de type et de GC, ce qui pourrait bien être meilleur. P>
J'ai toujours voulu un ordinateur qui a utilisé une adressage de points flottant ...
Tout est juste un tas de bits. (Allez prenez vos appareils de calcul Quantum N-State ailleurs ...)
Je ne peux pas penser à la raison pour laquelle cette connaissance est importante, tant que cela me donne ce que je veux et se comporte de manière conforme. Suis-je rater quelque chose? Un cas à titre est le "pointeur à membre" qui est représenté de manière spécifique à la mise en œuvre
J'aimerais savoir juste pour des raisons de la curiosité satisfaisante.
Il semble une sorte de définition circulaire. Comment avez-vous défini la "adresse"?
Je pense que la réponse de R. est plus générique. En effet, une "adresse" est un terme général pour diverses représentations; Par conséquent, un pointeur stocke certaines informations spécifiques à la mise en œuvre sur le "emplacement" d'un objet. Se référant à cette information comme "adresse" est de savoir ce que cela se déroule depuis des décennies et je ne vois aucune raison pratique de ne pas être en désaccord avec cela.