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 ?

Comment les références C 11 Rvalue et la sémantique de déplacement affectent-elles les instructions Return ?

Barbara Streisand
Libérer: 2024-12-24 12:42:15
original
687 Les gens l'ont consulté

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

C 11 rvalues ​​et déplacer la sémantique avec l'instruction 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();
Copier après la connexion

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

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

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

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