
Thomas Claveirole <thomas.claveirole@lrde.epita.fr> writes:
Astrid Wang <wang_a@epita.fr> writes:
point2d::minus() const { - point2d p(row(), col()); + point2d p(-row(), -col()); return p; }
Ne vaut-il mieux pas écrire :
point2d::minus() const { return point2d(-row(), -col()); }
Car sinon il y a un risque que ceci se produise :
* Appel du constructeur d'un point2d pour p avec (-row(), -col()).
* Appel du constructeur par copie de point2d a l'emplacement de la valeur de retour, en dehors de la fonction.
* Appel du destructeur de p.
La deuxième syntaxe, elle, autorise le compilateur à appler directement le bon constructeur a l'emplacement de l'objet qui va recevoir la valeur de retour.
cf. Thinking in C++, page 421, en bas. :)
gcc en -O3 optimise le premier code de sorte a ce qu'il n'y ai pas de problèmes, mais icc ne le fait pas. Et en plus, je trouve que gcc n'est pas très correct en se permettant de telles optimisations, qui risque de changer le comportement attendu.
Changer le comportement en quoi par exemple ?
Pour conclure, c'est ce genre de problème qui fait que vaucanson est beaucoup plus rapide quand on le compile avec gcc qu'avec icc.
Intéressant :) Si on y gagne à tous les coups, alors il faudra jeter un oeil dans les différents fichiers d'Olena car on peut trouver ce genre d'écriture un peu partout dans Olena. -- astrid