Maison >développement back-end >C++ >Comment les références C 11 Rvalue et la sémantique de déplacement affectent-elles les instructions Return ?
Comprendre les références rvalue et déplacer la sémantique
En C 11, rvalue des références et une sémantique de déplacement ont été introduites pour améliorer les performances et l'efficacité lors de l'utilisation de valeurs temporaires. Une référence rvalue (&&) fait référence à un objet temporaire, tandis que la sémantique de déplacement nous permet de déplacer le contenu d'un objet dans un autre sans le copier.
Exemple 1
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector();
Dans cet exemple, la fonction return_vector renvoie un objet std::vector temporaire, qui est capturé par la référence rvalue rval_ref. Puisque l'objet temporaire est déplacé dans rval_ref, cela empêche effectivement la copie.
Exemple 2
std::vector<int>&& return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();
Dans ce cas, la fonction return_vector renvoie le std temporaire : :objet vectoriel par valeur et utilise la fonction std::move pour déplacer explicitement le contenu de l'objet temporaire dans l'objet renvoyé. Cela crée une erreur d'exécution car rval_ref contient désormais une référence à l'objet temporaire détruit.
Exemple 3
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();
Cet exemple est similaire à l'exemple 1, où le La fonction return_vector renvoie l'objet temporaire std :: vector par valeur et utilise std :: move pour déplacer le contenu. Cependant, dans ce cas, std::move est inutile et peut nuire aux performances en empêchant l'optimisation de la valeur de retour.
Bonne pratique
La meilleure approche consiste à utiliser l'exemple 4, où l'objet temporaire est implicitement déplacé dans l'objet renvoyé sans utiliser explicitement std::move. Le compilateur effectuera une optimisation de la valeur de retour (RVO) pour éviter les copies inutiles.
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> rval_ref = return_vector();
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!