Vérifiez cette réponse pour C++11 . Fondamentalement, si vous passez une lvalue à la référence rvalue
De cet article :
void f1(String s) {
vector<String> v;
v.push_back(std::move(s));
}
void f2(const String &s) {
vector<String> v;
v.push_back(s);
}
" Pour l'argument lvalue, 'f1' a une copie supplémentaire pour passer l'argument car il est by-value, tandis que 'f2' a une copie supplémentaire pour appeler push_back. Il n'y a donc pas de différence ; pour un argument rvalue, le compilateur doit créer un temporaire 'String(L"")' et passer le temporaire à 'f1' ou 'f2' de toute façon. Parce que 'f2' peut profiter de move ctor quand l'argument est un temporaire (qui est une rvalue), les coûts pour passer l'argument sont les mêmes maintenant pour 'f1' et 'f2'."
Continuant : " Cela signifie que dans C++11, nous pouvons obtenir de meilleures performances en utilisant l'approche pass-by-value lorsque :
- Le type de paramètre prend en charge la sémantique de déplacement - Tous les composants de la bibliothèque standard le font en C++11.
- Le coût du constructeur de déplacement est beaucoup moins élevé que celui du constructeur de copie. (tant au niveau du temps que de l'utilisation de la pile).
- À l'intérieur de la fonction, le type de paramètre sera transmis à une autre fonction ou opération. qui supporte à la fois la copie et le déplacement.
- Il est courant de passer un temporaire comme argument - Vous pouvez organiser votre code pour le faire davantage.
"
Par contre, pour C++98, il est préférable de passer par référence - moins de données sont copiées. Le passage de const ou non const dépend de la nécessité de modifier l'argument ou non.