9
votes

Quand devrais-je choisir une copie élision par rapport à la transmission de la référence?

Dupliqué possible:
est une valeur de passage raisonnable à C ++ 11 ?

Je lis je lis Violez-vous? Passer par la valeur. par Dave Abrahams sur Copy Elision et RVO. Et je me demande pourquoi avons-nous besoin de la copie élision?

On m'a dit trop de fois que vous devriez passer des arguments de fonction par const Référence pour éviter la copie (presque tous les livres de C ++ que je lisai de cela ).

Supposons que nous ayons deux fonctions: xxx

si l'argument réel est une r devalue, la copie sera évitée dans les deux fonctions. Mais si l'argument réel est un lvalue, la copie ne sera évitée que dans F1, pas en F2. Alors, pourquoi avons-nous besoin de cette fonctionnalité?


0 commentaires

3 Réponses :


11
votes

passe de valeur si vous avez besoin d'une copie quand même. Que vous choisissiez la signature de F1 ou la signature de F2 dépend du contenu de la fonction. Par exemple, vous utiliseriez une référence de const dans ce cas: xxx

mais vous passeriez par valeur dans ce cas: xxx

car L'alternative serait la suivante: xxx


2 commentaires

Une note: Ce dernier cas se produit souvent dans les constructeurs. Donné structure s {s (...): s (s) {} std :: string s; }; , alors il est préférable d'utiliser std :: string s à la place de ... plutôt qu'un std :: string const & s < / code> car il y aura une copie quand même.


@Matthieum: Mais assurez-vous de le déplacer dans le membre, ne le copiez pas. I.e. s (std :: string s): s (std :: déplace (s)) {}



1
votes

RVO ne s'applique pas à votre exemple car la valeur de retour est int . xxx

Tally: 1-2 copies en C ++ 03, exactement 1 Dans C ++ 11 plus (si élision est désactivé), un geste qui peut dégénérer à une copie pour une autre classe que std :: string . xxx < p> Tally: 0-2 Copies en C ++ 03, ou 0-1 en C ++ 11.

Comme d'autres personnes ont dit, passez par valeur lorsque vous souhaitez manipuler l'objet comme une valeur pure. , sans aucune sémantique de référence.

const & est un idiome familier, mais c'est un peu d'un kilométrie en termes de sémantique du langage. Vous l'utilisez lorsque vous ne voulez pas une référence du tout; Le & sert simplement à créer le const significatif dans la définition de paramètre. Si vous souhaitez modifier le paramètre (mais uniquement localement), const ne s'applique pas vraiment, ainsi que le & goutte également.


0 commentaires

0
votes

F2 signaux par sa signature, peu importe ce que vous passez à moi, je traiterai de ma propre copie de votre objet. Utile, si F2 va modifier l'objet de manière non réversible (par exemple, il s'agit de ressources en déménagement) ou dans certains scénarios de concurrence. Certes, C ++ 11 ajoute un nouveau niveau de confusion au système de type C ++ (déjà déroutant), mais une fois que vous y réfléchissez, il a beaucoup de sens ...


0 commentaires