12
votes

Quelle est la différence de bas niveau entre un pointeur une référence?

Si nous avons ce code:

foo=100;
int& reference=foo;
reference=5;

foo=100;
int* pointer=&foo;
*pointer=5;


3 commentaires

Il n'y a pas de "types de variables" au niveau de l'assemblage. Tout est juste des bits à la fin. La différence est que pour une référence, il n'est pas nécessaire de ne pas être des bits (par exemple, si le compilateur peut déterminer qu'il fait toujours référence à une locale ou globale spécifique, elle peut simplement accéder directement à celle locale / globale et n'a pas besoin de stocker son adresse ailleurs).


Si nous savions pourquoi vous avez soigné, nous pourrions peut-être donner de meilleures réponses.


@OMnifarious juste curiosité, pas de raison spécifique réelle


4 Réponses :


19
votes

théoriquement, ils pourraient être mis en œuvre de différentes manières.

En pratique, chaque compilateur que j'ai vu compile des pointeurs et des références au même code de la machine. La distinction est entièrement au niveau de la langue.

Mais, comme Cdggins, vous ne devriez pas dépendre sur cette généralisation jusqu'à ce que vous avez vérifié, il est vrai que votre compilateur et votre plate-forme.


6 commentaires

Cependant, dans la pratique, les compilateurs éliminent souvent des références entièrement, surtout quand elles sont locales.


Les pointeurs aussi parfois, s'ils le peuvent.


Ainsi, exactement quelle combinaison d'architecture de machine, de compilateur et de paramètres d'optimisation est-elle vraie?


MSVC, GCC, Metrowerks, Suncc, Intel sur X86-32, X86-64, PPC, Moteur d'émotion, Cellule / SPU, XENON, MOTO, SPARC, MIPS.


Oh, et quel que soit le compilateur de merde SGI expédié avec IRIX pour leurs indigètes.


Avec toute honnêteté, je suis imprimé! Je tiens toujours mon point d'origine: deviner au code de la machine ne veut que demander des problèmes à moins que votre architecture et votre compilateur soient fixes.



1
votes

Les pointeurs et les références ont une sémantique différente en C ++, mais le code généré est le même.


3 commentaires

Rien dans la spécification C ++ ne le nécessite.


Cela pourrait être différent bien sûr, mais il est probablement plus simple de mettre en œuvre de cette façon.


@CDiggins: Vous avez raison, mais pratiquement lorsque vous utilisez une référence dans un contexte où vous pourriez utiliser un pointeur, vous obtiendrez probablement le même code.



10
votes

Il n'y a absolument rien de fiable sur la relation entre le code C ++ et quel code un compilateur à la machine génère.

Certaines personnes disent "dans mon expérience ... etc. etc." Mais cela est plus peu fiable que vous ne pourrez réaliser. Peu de personnes ont une expérience réelle dans une section substantielle de toutes les combinaisons de compilation / architecture possibles. [EDIT: Je pense que Crashworks me prouve mal cependant. : -)]

Considérez le suivant Liste des compilateurs C ++ :

  • C ++ Builder
  • Turbo C ++ Explorer
  • Compiler C ++
  • Borland C ++
  • Turbo C ++ pour DOS
  • CLANG
  • Comeau C / C ++
  • Système de développement de compilateur confortable
  • Mars numériques
  • DJGPP
  • Bras de bord C / C ++
  • mingw
  • GCC C ++ (G ++)
  • HP AC ++
  • Compilateur Intel C ++
  • microtec
  • MULTI
  • Open Watcom
  • open64
  • pathscale
  • PGI Workstation
  • Atelier Prodev
  • compilateur View C / C ++ (ARMCC)
  • SAS / C C ++
  • Sun Studio
  • tendra
  • vectoriel
  • Visual C ++
  • Visualage C ++
  • XL C / C ++

    Multipliez maintenant cette liste par le Liste courte des architectures de la machine :

    • bras
    • Atmel AVR
    • Blackfin
    • HC12
    • H8 / 300
    • IA-32 (X86)
    • X86-64
    • IA-64
    • Motorola 68000
    • MIPS
    • PA-RISC
    • PDP-11
    • PowerPC
    • R8C / M16C / M32C
    • SPU
    • SYSTEM / 390 / ZSERIES
    • Superh
    • SPARC
    • VAX
    • A29K
    • arc
    • étrax cris
    • D30V
    • DSP16XX
    • FR-30
    • FR-V
    • Intel I960
    • IP2000
    • M32R
    • 68HC11
    • MCORE
    • MMIX
    • MN10200
    • MN10300
    • Motorola 88000
    • NS32K
    • romp
    • Stormy16
    • V850
    • xttensa
    • AVR32

      Multipliez maintenant par le système d'exploitation et les drapeaux d'optimisation, et vous constaterez peut-être que l'expérience de tout le monde manque malheureusement.


4 commentaires

Votre nom était familier et je me suis souvenu de héron :)


Je suis curieux si vous avez un contre-échantillon spécifique où les pointeurs et les références sont mis en œuvre différemment.


Non, mais il est en fait surprenant que je ne l'ai pas vu. Il existe sûrement des optimisations de gestion de la mémoire potentielles disponibles lorsque l'adresse de mémoire réellement est masquée de l'utilisateur.


@Will: avons-nous rencontré? Ou vous venez-vous de me voir Blather sur Héron à différents endroits?



0
votes

Juste pour amplifier, alors qu'il serait peut-être vrai que les références sont les mêmes que les pointeurs sous le capot sur presque tous les compilateurs, c'est une grave erreur de dépendre de ce comportement. Non seulement il est susceptible de vous mordre sur le cul lorsque vous vous y attendez le moins, mais c'est aussi une utilisation incorrecte de références. Si c'est un pointeur dont vous avez besoin, utilisez un pointeur.


0 commentaires