
"Thomas" == Thomas Claveirole <thomas.claveirole@lrde.epita.fr> writes:
Thomas> Astrid Wang <wang_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