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
Barbara Streisandoriginal
2024-12-24 12:42:15615parcourir

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();

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!

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