2010-10-13 18 views
2

Valeurs de retour de fonction par rapport au paramètre "sortie", lequel est le plus rapide? Je pense que je peux mieux expliquer en utilisant ce que je suis en train de travailler. Bien que je préfère f1 et f3, parce qu'ils retournent SceneNode *, ils aboutissent à un appel ambigüs. De plus, souvent, seul SceneNode * est requis. La chaîne & en f3 présentera quelques inconvénients et frais généraux, donc je prévois f1 et f2.Efficacité. Valeurs de retour de fonction par rapport aux paramètres de sortie

Ma question est, il y aura une différence entre

f2(node); // return value not assigned. 
      // will there be an optimisation NOT to copy string? 
mystring = f2(node); 

Je pense que le stockage des paramètres de fonctionnement devrait être dans une zone très rapide accès et sera facilement disponible si les paramètres de sortie fonctionnent plus rapidement. cependant, si l'optimisation est faite pour éviter la chaîne de copie dans f2, alors f2 sera meilleur que f4.

Je sais que dans mon exemple, cela pourrait être minime, mais je veux juste savoir pour le savoir/l'intérêt.

une autre question: je suppose toujours que les références sont des données 32 bits et que la référence de passage est aussi rapide que les pointeurs, est-ce vrai?

Merci. =)

Répondre

2

La différence entre

mystring = f2(node) 

et

f2(node) 

sont importants pour comprendre. Dans le premier cas, la plupart des compilateurs optimisent le constructeur de copie pour le retour par valeur et affectent simplement la chaîne de la fonction sans l'étape de copie supplémentaire. Dans le cas de la deuxième version, la plupart des optimiseurs suppriment entièrement toute copie ou affectation (il n'y a aucune affectation et le constructeur de copie pour le retour peut être optimisé). Votre déclaration à propos de f2 par rapport à f4 est précise. En raison des optimisations de retour, f2 a de bonnes chances de surperformer f4. (Je vais ajouter un lien vers un bel article quand je le trouverai.)

Oh, et passer des pointeurs par référence est très bien.

1

Je voudrais utiliser f1 et f3 et simplement changer le nom de l'une des fonctions (par exemple f1 =>createSceneNodeWithId). La sémantique des deux fonctions est suffisamment différente pour justifier des noms différents. Je voudrais éviter une référence à un pointeur (SceneNode *&), car il peut être un peu déroutant.

Le retour d'un String peut être lent, alors oui, il vaut mieux l'éviter et utiliser un paramètre de sortie. Je ne pense pas que la copie peut être optimisée sauf si (a) la fonction est en ligne ou (b) votre compilateur effectue une bonne analyse de tout le programme. Le compilateur Intel C++ fait cela, mais je ne sais pas s'il va attraper ce cas. En réponse à votre question de côté: une référence est vraiment un pointeur avec une syntaxe différente. Ce sera 32 bits de large sur une plate-forme 32 bits, 64 bits sur une plate-forme 64 bits.