>> "Thomas" == Thomas Claveirole
<thomas.claveirole(a)lrde.epita.fr> writes:
Thomas> Astrid Wang <wang_a(a)epita.fr> writes:
> point2d::minus() const
> {
> - point2d p(row(), col());
> + point2d p(-row(), -col());
> return p;
> }
Thomas> Ne vaut-il mieux pas écrire :
Thomas> point2d::minus() const
Thomas> {
Thomas> return point2d(-row(), -col());
Thomas> }
Thomas> Car sinon il y a un risque que ceci se produise :
Thomas> * Appel du constructeur d'un point2d pour p avec (-row(), -col()).
Thomas> * Appel du constructeur par copie de point2d a l'emplacement de la
Thomas> valeur de retour, en dehors de la fonction.
Thomas> * Appel du destructeur de p.
Thomas> La deuxième syntaxe, elle, autorise le compilateur à appler
Thomas> directement le bon constructeur a l'emplacement de l'objet qui
va
Thomas> recevoir la valeur de retour.
Pour autant que je sache, la première aussi, car elle est
sujette à l'optimisation de la valeur de retour nommée (sur
le net: "Named return value optimization" ou encore "RVO").
C'est un sujet qu'on a discuté il y a quelques années au labo,
quelqu'un en a peut-être encore des traces quelque part.
En tout cas c'est la raison pour laquelle on préfère écrire
A operator+(const A& l, const A& r)
{
A a(l)
a += r;
return a;
}
plutôt que
A operator+(const A& l, const A& r)
{
return A(l) += r;
}
Dans le premier cas le compilateur pour placer `a' directement à
l'emplacement de la valeur de retour, pour éviter la copie.
Dans le second cas compilateur ne sait pas a priori que
l'adresse du résultat de `+=' est la même que celle de la
variable temporaire créée pour A(l).
(J'ai bien compris que tu n'es pas tout as fait dans ce cas là.
Je justifie juste le comportement de gcc: la norme lui permet
cette optimisation.)
--
Alexandre Duret-Lutz