Comprendre le comportement de retour des variables locales
Lors du retour d'une variable locale à partir d'une fonction, son comportement peut varier en fonction des optimisations du compilateur.
NRVO (Named Return Value Optimization)
Lorsque NRVO est activé, le compilateur optimise l'instruction de retour en créant l'objet renvoyé directement sur le site de la valeur de retour. Dans ce cas, aucune copie n'est effectuée et l'objet original est détruit après le retour.
Sortie avec NRVO activé
// With NRVO enabled, only one constructor and destructor call is made. class test { public: test(int p) { std::cout << "Constructor (test(int p)) called\n"; } ~test() { std::cout << "Destructor called\n"; } }; test function() { test i(8); return i; } int main() { test o = function(); return 0; }
Sortie :
Constructor (test(int p)) called Destructor called
NRVO désactivé
Pour désactiver NRVO, utilisez l'indicateur -fno-elide-constructors lors de la compilation. Dans ce cas, le compilateur n'exécute pas NRVO et une copie de l'objet est créée dans la valeur de retour.
Sortie avec NRVO désactivé
// With NRVO disabled, both constructor and destructor calls are made twice. class test { public: test(int p) { std::cout << "Constructor (test(int p)) called\n"; } test(test&& other) { std::cout << "Constructor (test(test&& other)) called\n"; } ~test() { std::cout << "Destructor called\n"; } }; test function() { test i(8); return i; } int main() { test o = function(); return 0; }
Sortie :
Constructor (test(int p)) called Constructor (test(test&& other)) called Destructor called Destructor called
Résumé
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!