2013-07-30 1 views
1

J'ai un codesur les fonctions répétées

void Foo() 
{ 
    auto index = currentIndex(); 
    if (index.isValid()) 
     index.doSomething(); 
} 

une autre option

void Foo() 
{ 
    if (currentIndex().isValid()) 
     currentIndex().doSomething(); 
} 

Le second est plus lisible pour moi. Mais comment est sa performance? Est currentIndex() calculé deux fois dans le compilateur populaire actuel? Si currentIndex() est une grande fonction qui prend un peu de temps CPU, le compilateur optimisera-t-il le second comme le premier?

+1

Le nom de la variable 'index' est assez clair. – Rapptz

+0

Que retourne' currentIndex() '? Les premier et deuxième exemples semblent ne pas être identiques. –

+0

oui, currentIndex() sera appelé deux fois dans la 2ème solution –

Répondre

1

Le premier aura probablement de meilleures performances et IMO est plus lisible, car si vous appelez simplement currentIndex() par lui-même, vous n'avez aucune information à ce sujet. Si vous l'attribuez à une variable, vous l'avez pour une utilisation future.

Un compilateur aurait aucune chance d'optimiser l'appel sur, pour de nombreuses raisons

  1. le premier appel aurait pu changer le résultat du prochain appel
  2. Les ayant 2 appels de la fonction peuvent changer la état de votre programme
  3. probablement un tas d'autres raisons que je ne peux pas penser à

en conclusion il n'y a aucune raison pour laquelle vous ne seriez pas utiliser la première version, je peux assurer que la plupart des gens trouveraient également cette version plus lisible. L'attribution de données à un nom est l'une des pierres angulaires de la programmation moderne, donc si elle est plus lisible lorsque les données n'ont pas de nom, vous voudrez peut-être vous habituer à des variables ayant des noms

Une autre note, pour en faire plus lisible ne pas utiliser automatique, qui est mieux enregistré pour la programmation de modèles où le type peut être une peine à comprendre par vous-même.

+0

Nice, aléatoirement dv mois après avoir répondu à la question – aaronman

0

Pour moi, la première option ne laisse aucune question de performance, ce que je préférerais. Cela étant dit, tout dépend du contexte, de l'utilisation et du coût de currentIndex(). Si currentIndex() est un getter trivial, et Foo() n'est pas appelé dans une boucle lourde, alors il y a peu de différence, le cas échéant.

+0

Je pense que la question était en fait le compilateur optimiser le deuxième appel loin (je l'ai dit non) ne l'appelle pas deux fois pire, juste un heads-up de sorte que vous ne descendre downvoted :) – aaronman

Questions connexes