Maison >développement back-end >C++ >Quel est l'impact des références Rvalue et de la sémantique de déplacement sur les instructions de retour C 11 ?

Quel est l'impact des références Rvalue et de la sémantique de déplacement sur les instructions de retour C 11 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-21 15:11:10567parcourir

How Do Rvalue References and Move Semantics Impact C  11 Return Statements?

Références Rvalue et sémantique de déplacement en C 11 avec des instructions de retour

C 11 a introduit les références rvalue et la sémantique de déplacement pour améliorer les performances en évitant les copies inutiles et en optimisant la création d'objets. Comprendre les différences entre ces techniques est crucial pour écrire du code efficace.

Exemple d'analyse

Considérez les exemples de code C 11 suivants :

Premier exemple :

std::vector<int> return_vector() {
    std::vector<int> tmp {1, 2, 3, 4, 5};
    return tmp;
}

std::vector<int> &&rval_ref = return_vector();

Deuxième Exemple :

std::vector<int>&& return_vector() {
    std::vector<int> tmp {1, 2, 3, 4, 5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

Troisième exemple :

std::vector<int> return_vector() {
    std::vector<int> tmp {1, 2, 3, 4, 5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

Explication

Premier exemple :

  • Le type de retour est une référence lvalue std::vector&.
  • tmp est une variable locale et donc une rvalue temporaire.
  • Le tmp temporaire est renvoyé par copie, donc aucune sémantique de déplacement n'est impliquée.
  • rval_ref devient une référence lvalue non const au retour vector.

Deuxième exemple :

  • Le type de retour est une référence rvalue std::vector&&.
  • tmp est toujours une rvalue temporaire.
  • std::move(tmp) force la fonction à renvoie la valeur rvalue temporaire par déplacement, au lieu de copier.
  • Cela signifie que tmp est déplacé dans la valeur de retour et rval_ref contient désormais une référence rvalue valide.

Troisièmement Exemple :

  • Cet exemple est similaire au premier.
  • Le retour type est une référence lvalue std::vector&, malgré le std::move(tmp).
  • std::move(tmp) est inutile et ne sert à rien dans ce contexte.
  • Le tmp temporaire est renvoyé par copie, et rval_ref devient une référence lvalue non const au retour vector.

Meilleure pratique

La méthode recommandée pour renvoyer un objet temporaire en tant que référence de valeur de déplacement uniquement (par exemple, std::vector&&) consiste simplement à omettre la référence et laisser le compilateur décider de déplacer ou de copier l'objet en fonction de l'optimisation de la valeur de retour (RVO).

std::vector<int> return_vector() {
    std::vector<int> tmp {1, 2, 3, 4, 5};
    return tmp;
}

std::vector<int> rval_ref = return_vector();

Ceci L'approche offre la meilleure combinaison de performance et d'exactitude.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn