2009-03-20 13 views
6

Dans un previous question, il est apparu qu'une fonction de retour par valeur simple copie toujours son argument return dans la variable qui lui est affectée.Optimisation du constructeur de la copie par rapport à l'optimisation de la valeur de retour

Est-ce requis par la norme, ou la fonction peut-elle être optimisée en construisant la variable 'assigné' même dans le corps de la fonction?

struct C { int i; double d; }; 

C f(int i, int d) { 
    return C(i,d); // construct _and_ copy-construct? 
} 

int main() { 
    C c = f(1, 2); 
} 

Répondre

7

La norme permet à tout niveau d'omission de copie ici:

  • construire un local temporaire, copier-construire dans une valeur de retour, et copier-construire la valeur de retour dans le « c » locale. OU
  • construire un local temporaire, et copier-construire que dans "c". OU
  • construction « c » avec les arguments « i, d »
+0

Pourriez-vous fournir le numéro de section de la norme s'il vous plaît? –

+0

La même chose que Neil posté: 12.15. L'interprétez-vous différemment? –

7

La norme dit que le constructeur de copie ne doit pas être utilisé - voir la section 12.8/15:

15 Chaque fois qu'un objet de classe temporaire est copié à l'aide d'un constructeur de copie, et cet objet et la copie ont le même type cv-non qualifié, une implémentation est autorisé à traiter l'original et la copie comme deux différentes façons de se référer au même objet et ne pas effectuer une copie à tous, même si le constructeur de copie de classe ou le destructeur ont des effets de côté .

Et beaucoup plus dans une veine similaire.

+0

12,5 dans ma norme de 1998 est "Free store" référez-vous à d'autres normes? –

+0

Doit avoir été 12.8/15 –

-1

Il y a une très simple et bon moyen d'éviter ces considérations tout à fait - vous pouvez envisager de revenir un coup de pouce :: shared_ptr à l'objet créé - il en sera pratiquement de même en ce qui concerne la facilité d'utilisation, mais votre objet ne sera sûrement pas copié inutilement - et il en sera de même si vous le renvoyez via deux couches d'appels de fonction.

+0

ce n'est pas un bon pour shared_ptr std :: string ou std :: pair ou std :: vector. –

+0

Pour éviter la construction de copie, je pourrais utiliser tas i.s.o. stockage de pile. Je sais que:)/ Mais je voulais savoir si je pouvais faire confiance au compilateur, c'est-à-dire la norme à _guarantee_ appelant mon constructeur de copie. Ce que je ne peux pas. – xtofl

+0

curieux: pourquoi avez-vous besoin de cette garantie de toute façon xtof? –

0

Way pas passer paramètre par référence et affecter le résultat?

+0

parce qu'il est plus laid et moins flexible sur le site d'appel. Cela ne devrait être fait que dans des endroits critiques. –

+0

Ou lorsque vous avez besoin de plusieurs valeurs de retour (un statut et une valeur par exemple) – xtofl

Questions connexes