avoir suppose qu'aucun opérateur n'est surchargé. p> plus efficace (le cas échéant)? p> quelque part à l'arrière de ma tête, j'entends des cloches sonneries , que l'opérateur Le fond de cette question sont des cas comme celui-ci: P>
(* p) .name code> vs. strong>
p-> nom code> p>
* code> Dréréférence peut créer une copie temporaire d'un objet; est-ce vrai? p>
Person& Person::someFunction(){
...
return *this;
}
4 Réponses :
Il n'y a pas de différence. Même la norme dit que les deux sont équivalents, et s'il y a un compilateur qui ne génère pas le même binaire pour les deux versions, c'est un mauvais. P>
La même chose pour les types intégrés et défini par l'utilisateur ??
@Kalamarobliwy en supposant une surcharge de l'opérateur, oui.
Et pour les pointeurs intelligents standard ( std :: unique_ptr code>,
std :: partagé_ptr code>), les opérateurs surchargés se comportent toujours de la même manière.
Tout bon compilateur produira les mêmes résultats. Vous pouvez vous répondre vous-même, compiler les deux codes à assembler et vérifier le code produit. P>
Lorsque vous retournez une référence, c'est exactement la même chose que de repasser un pointeur, la sémantique du pointeur exclu em>. Ainsi, lorsque vous faites cela: P>
Vous écrivez un tailleOf (vide *) code> élément, pas un
Tailleof (votreclass) code>.
Person& Person::someFunction(){
...
return *this;
}
C'est un bon point sur la taille du retour. Pouvez-vous expliquer, qu'est-ce que * p code> est juste par lui-même alors? Le résultat est une personne et une personne, ou une personne constante et?
Vous obtenez un l-valse code>, qui fait référence à l'adresse de l'objet, si je lisais Stackoverflow.com/questions/11347111/... correctement et selon Wikipedia: en.wikipedia.org/wiki/value_ (Computer_Science)
Oui, il est beaucoup plus difficile de lire et de taper, de sorte que vous êtes beaucoup mieux à utiliser le Il n'y a certainement aucun objet supplémentaire créé lorsque retourner une référence est généralement plus efficace, car elle renvoie un pointeur (déguisé) à l'objet, plutôt que de faire une copie de l'objet. Pour les objets plus gros que la taille d'un pointeur, c'est généralement une victoire. p>
[1] Oui, nous pouvons avoir un compilateur C ++ pour un processeur qui n'a pas de registres. Je connais d'au moins un processeur de Class-Xerox que j'ai vu dans environ 1984, qui n'a pas de registres, c'était un processeur LISP dédié, et il suffit d'une pile pour des objets LISP ... mais ils sont loin d'être communs dans le monde d'aujourd'hui. Si quelqu'un travaille sur un processeur qui n'a pas de registres, veuillez ne pas descendre ma réponse simplement parce que je ne couvre pas cette option. J'essaie de garder la réponse simple. p> x-> y code> que
(* x) .y code> - mais autre que Efficacité de taper, il n'y a absolument aucune différence. Le compilateur doit toujours lire la valeur de
x code> puis ajouter le décalage à
y code>, que vous utilisiez un formulaire ou l'autre [en supposant qu'il n'y a pas d'objets / classes amusants impliqués qui remplacent le
opérateur -> code> et
Opérateur * code> respectivement, bien sûr] p>
(* x) code> est référencé. La valeur du pointeur est chargée dans un registre dans le processeur [1]. C'est tout. P>
À ce stade, vous devriez beaucoup plus vous inquiéter de la lisibilité, et étant donné que
-> code> est le sucre syntaxique plus courant,
(* i) .m code> est fronçonné dans de nombreux endroits. Seulement si un profilage indique qu'il pourrait y avoir un problème en rapport avec cela, vous devriez commencer à vous inquiéter de son efficacité.
Je m'attendrais à ce que le compilateur produise exactement le même résultat. Vous pouvez vous répondre vous-même, compiler les deux codes à assembler et vérifier le code produit.
J'ai posé cette question à cause de la Contexte I> J'ai décrit - de nombreux opérateurs de base renvoient généralement une référence à soi et je vois très souvent qu'ils revenaient
* ce code>;
* p code> est une valeur L (vous pouvez faire
* p = quelque chose; code>). Comment cela pourrait-il créer un objet temporaire?
@Angew bon point, je pensais à
personne & p2 = * p; code> et la possibilité qu'ils ne font pas référence au même objet
@Kalamarobliwy Il n'y a pas de telles possibilités. L'opérateur Dréréférence du pointeur intégré
* code> renvoie une valeur L désignant l'objet pointé sur (vous pouvez y penser comme une référence à celle-ci).
Quelques conteneurs comme Boost's
fibonacci_heap code>
avoir unmanipul_type code> qui ne supporte même pas
opérateur -> code> (probablement uniquement hors de l'oubli), donc si vous êtes extrêmement général, vous devrait probablement utiliser une déséroférence explicite. Je ne le recommande pas cependant.