Passer std :: ssortingng par Value ou Reference

Duplication possible:
Les jours de passage de const std :: ssortingng & en tant que paramètre sont-ils dépassés?

Dois-je passer std::ssortingng par valeur ou par référence (à une fonction non incorporée) si la sémantique de déplacement est prise en charge? Et qu’en est-il des implémentations utilisant l’optimisation des petites chaînes (SSO)?

Il y a plusieurs réponses en fonction de ce que vous faites avec la chaîne.

1) Utiliser la chaîne comme un identifiant (ne sera pas modifié). Le faire passer par une référence const est probablement la meilleure idée ici: (std::ssortingng const&)

2) Modifier la chaîne mais ne veut pas que l’appelant voie ce changement. Le faire passer par valeur est préférable: (std::ssortingng)

3) Modifier la chaîne mais vouloir que l’appelant voie ce changement. Il est préférable de le (std::ssortingng &) par référence: (std::ssortingng &)

4) L’envoi de la chaîne dans la fonction et l’appelant de la fonction n’utiliseront plus jamais la chaîne. L’utilisation de la sémantique de déplacement peut être une option (std::ssortingng &&)

Vérifiez cette réponse pour C ++ 11 . Fondamentalement, si vous passez une lvalue, la référence rvalue

De cet article :

 void f1(Ssortingng s) { vector v; v.push_back(std::move(s)); } void f2(const Ssortingng &s) { vector v; v.push_back(s); } 

“Pour l’argument lvalue, ‘f1’ a une copie supplémentaire pour passer l’argument car il est de valeur, tandis que ‘f2’ a une copie supplémentaire pour appeler push_back. Donc aucune différence; pour un argument rvalue, le compilateur doit créer un “Ssortingng (L” ”) ‘et passer le temporaire à” f1 “ou” f2 “de toute façon. Parce que” f2 “peut tirer parti de move ctor lorsque l’argument est temporaire (ce qui est une valeur), les coûts pour passer le les arguments sont les mêmes pour “f1” et “f2″. ”

En continuant: “Cela signifie qu’en C ++ 11, nous pouvons obtenir de meilleures performances en utilisant une approche par valeur lorsque:

  1. Le type de paramètre prend en charge la sémantique de déplacement – Tous les composants de bibliothèque standard fonctionnent en C ++ 11
  2. Le coût du constructeur de déménagement est beaucoup moins élevé que celui du constructeur de copie (à la fois le temps et l’utilisation de la stack).
  3. A l’intérieur de la fonction, le type de paramètre sera transmis à une autre fonction ou opération prenant en charge à la fois la copie et le déplacement.
  4. Il est courant de passer un argument temporaire comme argument – Vous pouvez organiser votre code pour le faire davantage.

OTOH, pour C ++ 98, il est préférable de passer par référence – moins de données sont copiées. Passer const ou non dépend de la nécessité ou non de modifier l’argument.

Je crois que la réponse normale est que cela devrait être passé par valeur si vous devez en faire une copie dans votre fonction. Passez-le par la référence const sinon.

Voici une bonne discussion: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/