Les références Rvalue et la sémantique de déplacement en C 11 dévoilées
En C 11, les références rvalue et la sémantique de déplacement fournissent des techniques puissantes pour améliorer les performances et l'efficacité . Cet article explore les nuances de ces concepts à travers une analyse détaillée de trois exemples :
Premier exemple :
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 vectoriel par valeur. La référence rvalue rval_ref se lie à cet objet temporaire. La durée de vie de l'objet temporaire est prolongée au-delà de l'appel de fonction, permettant à rval_ref de continuer à accéder à ses données. Cependant, toute modification apportée via rval_ref n'affectera pas le vecteur d'origine.
Deuxième exemple :
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 défectueux en raison d'une erreur d'exécution. La fonction return_vector utilise std::move sur le vecteur temporaire tmp avant de le renvoyer. Cela détruit efficacement tmp et laisse rval_ref contenant une référence à une mémoire invalide. Par conséquent, ce code peut planter lors de l'exécution.
Troisième exemple :
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();
Similaire au premier exemple, cet exemple utilise std::move sur le vecteur temporaire tmp avant de le renvoyer par valeur. Cependant, étant donné que la fonction renvoie déjà par valeur, std::move est redondant et peut nuire aux performances en raison d'opérations de mémoire supplémentaires.
Meilleure pratique :
La meilleure façon d'écrire ce code est d'omettre le std::move inutile et de s'appuyer sur la conversion implicite des rvalues par C 11 en retour. déclarations :
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 ce cas, le compilateur optimisera le retour en utilisant l'optimisation de la valeur de retour (RVO) pour éliminer les copies ou déplacements inutiles. Alternativement, si RVO n'est pas réalisable, le compilateur utilisera le constructeur de déplacement de la classe vectorielle pour effectuer un transfert de propriété efficace.
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!