constructeur de copie par rapport à l'optimisation de la valeur de retour
-
21-08-2019 - |
Question
Dans un précédent question , il est apparu qu'une fonction de retour par valeur toujours simple copie son argument dans la variable return
étant affectée de celui-ci.
Est-ce requis par la norme, ou la fonction peut être optimisée en construisant le « attribué à » variable 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 );
}
La solution
La norme permet à tout niveau d'omission de copie ici:
- construire local temporaire, copie construire en une valeur de retour, et copier-construire la valeur de retour dans le « c » locale. ou
- la construction d'un local temporaire et copier-construire que dans « c ». ou
- construction "c" avec les arguments "i, j"
Autres conseils
La norme indique que le constructeur de copie ne doit pas être utilisé - voir la section 12.8 / 15:
15 A chaque fois qu'un objet de classe temporaire est copiée à l'aide d'un constructeur de copie, et cet objet et la copie ont la même type cv-non qualifié, une la mise en œuvre est autorisé à traiter l'original et la copie en deux différentes manières de se référer à la même objet et non effectuer une copie à tous, même si la copie de classe constructeur ou destructeur ont latérale effets.
Et beaucoup plus dans la même veine.
Way passe pas paramètre par référence et affecte le résultat à elle?
Il y a un 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 sera pratiquement le même en ce qui concerne la facilité d'utilisation, mais votre objet ne sera sûrement pas copier inutilement -. et ce sera vrai aussi si vous le retourner si un couple de couches appels de fonction