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
Libérer: 2024-12-21 15:11:10
original
616 Les gens l'ont consulté

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();
Copier après la connexion

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();
Copier après la connexion

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();
Copier après la connexion

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();
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal