0
votes

Les références créent-elles toujours un pointeur implicite?

Si je crée une référence à une variable à l'intérieur du champ d'application d'une fonction comme celle-ci: xxx

créera-t-il toujours un pointeur implicite? Création d'un pointeur est nécessaire si la référence est un paramètre de fonction, mais dans ce cas, il est identique à celui de x directement.


3 commentaires

Détails de la mise en œuvre que vous ne devriez pas vous inquiéter d'un côté, il n'y a pas de pointeur. Une référence est une référence.


Les variables (même les variables des membres) n'ont pas besoin de sortir d'une adresse mémoire. Le compilateur est libre de faire ce qu'il veut aussi longtemps que le code se comporte en fonction de la spécification. Dès que la valeur d'une variable pourrait rester uniquement dans un registre.


Il n'est pas nécessaire que la mémoire soit allouée à représenter ref dans ce cas. Après la définition de ref , toute utilisation de ref peut simplement être tournée directement dans un accès de x . Cela fonctionne, car il n'ya aucun moyen de détecter si la référence existe - & ref donnera le même résultat que & x . En fait, si ref et x ne sont pas utilisés du tout dans le bloc où ils sont définis, la plupart des compilateurs modernes sont capables d'éliminer les deux x et ref hors de l'existence, il est donc comme si elles n'existaient jamais.


3 Réponses :


1
votes

C'est un détail de mise en œuvre non spécifié. (Les paramètres de fonction peuvent être transmis dans des registres, ce qui signifierait aucun pointeur non plus.)

mais dans cette lunette (automatique), ref est juste un alias pour x , donc aucun pointeur n'est nécessaire pour le compilateur.


0 commentaires

3
votes

Pas nécessairement. Comment votre compilateur implémente les références est là-dessus, tant qu'il suit la norme C ++.

N'oubliez pas que le compilateur adoptera la règle si . Vous programmez le comportement destiné . Le compilateur génère le code. Un bon compilateur manquera votre extrait de code entièrement car il n'a aucun effet observable.

voir Quoi de la règle "As-Si"?


0 commentaires

0
votes

D'autres ont déjà donné la réponse officiellement correcte. J'essaie avec une perspective plus pratique. En principe, oui, le compilateur «toujours» créera un pointeur implicite. Fréquemment, qu'un pointeur est le seul moyen d'être mis en œuvre.

Cependant, le compilateur emploie de nombreuses stratégies d'optimisation et, par conséquent, le pointeur implicite peut et sera optimisé.

Quelques exemples :

dans votre exemple ci-dessus, car les variables ne sont jamais utilisées, tout même la variable x sera optimisée.

Si vous passez la référence à Une fonction qui ne peut pas être inlinée, la référence sera probablement tenue. Si la fonction peut être inlinée, les références peuvent probablement être optimisées également. xxx

si la fonction ci-dessus est généralement équivalente à l'utilisation des pointeurs. Si vous demandez à votre compilateur de produire le code de montage, à l'exception de certaines différences mineures, elle produira le même code. Dans de nombreux cas, la fonction peut être inlinée, ce qui signifie que votre appel à la fonction Swap sera remplacé par ce que fait la fonction. En conséquence, les références seront probablement optimisées (identiques seraient le cas si vous utilisiez des pointeurs).

Si votre question devient plus profonde et qu'il y a une différence d'utilisation des pointeurs par rapport aux références par rapport aux références, elles sont également coûteux. Une référence ne peut pas remplacer par magie la nécessité d'un pointeur. D'autre part, même si elles sont identiques, les références ne sont pas redondantes d'un point de vue de la lisibilité du code.

à la fin, comme les autres ont expliqué l'utilisation tout ce qui rend votre programme plus lisible et don ' t vous soucier de la différence.

EDIT: Vecteur supprimé échantillon - Merci IDCLEV 463035818


6 commentaires

Cet argument peut être étendu à l'idée que int x; déclare un pointeur implicite parce que je pouvais écrire & x sur la rvalue de ce pointeur implicite à tout moment.


afaik vecteur n'est pas possible


@ idclev463035818 En effet, merci de l'indiquer, supprimé.


Vous pouvez avoir un std :: vecteur > à travers. std :: référence_wrapper utilise effectivement un pointeur. Oh l'ironie!


@ idclev463035818 Je pense que nous devrions nous insister sur la différence, pour la performance et parce que nous devons souligner comment cela fonctionne, THZT est le point d'utiliser une langue de niveau lol comme C ++.


@LInterNetSansAnfil Il est correct qu'il est bon de connaître les implications des choix sur la performance d'une application. La bonne nouvelle, dans ce cas, il n'y en a pas, cela dépend vraiment de ce qui est plus lisible. Toutefois, avant d'optimiser l'utilisation de la fonction de langage X Versus Language, il est toujours préférable de penser à la complexité d'exécution de l'algorithme que l'on utilise et s'il existe un meilleur algorithme.