Maison > développement back-end > C++ > Comment l'optimisation de la valeur de retour nommée (NRVO) affecte-t-elle le comportement de rendement des variables locales ?

Comment l'optimisation de la valeur de retour nommée (NRVO) affecte-t-elle le comportement de rendement des variables locales ?

Barbara Streisand
Libérer: 2024-11-09 09:03:02
original
791 Les gens l'ont consulté

How Does Named Return Value Optimization (NRVO) Affect Local Variable Return Behavior?

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

Sortie :

Constructor (test(int p)) called
Destructor called
Copier après la connexion

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

Sortie :

Constructor (test(int p)) called
Constructor (test(test&& other)) called
Destructor called
Destructor called
Copier après la connexion

Résumé

  • Avec NRVO activé, le renvoi d'une variable locale élimine le besoin d'une copie, construit directement l'objet sur le site de retour, et détruit immédiatement l'objet original.
  • Avec NRVO désactivé, une copie de l'objet est créée et renvoyée, ce qui donne deux copies de l'objet.

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!

source:php.cn
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