Question

Je pensais que lorsqu'une fonction retourne un objet sur la pile à la fonction d'appel, la fonction appelante obtient une copie de l'objet original, mais le destructeur de l'objet original est appelé dès que la pile dévide. Mais dans le programme suivant, le destructor est appelé une seule fois se. Je m'y attendais à appeler deux fois.

#include <iostream>

class MyClass
{
public:
  ~MyClass() { std::cout << "destructor of MyClass" << std::endl; }
};

MyClass getMyClass()
{
  MyClass obj = MyClass();
  return obj;   // dtor call for obj here?
}

int main()
{
  MyClass myobj = getMyClass();
  return 0;  // Another dtor call for myobj.
}

Mais « destructor de MyClass » est imprimé une seule fois se. Mon hypothèse erronée ou est-il autre chose qui se passe ici?

Était-ce utile?

La solution

Ceci est un cas particulier où le compilateur est autorisé à optimiser la copie: on l'appelle l'optimisation appelée valeur de retour (NRVO). Fondamentalement, le compilateur alloue de la mémoire pour l'objet de retour sur le site d'appel et permet le remplissage de fonction dans la mémoire directement au lieu de créer l'objet sur le site appelé et la copie en arrière. Les compilateurs modernes font régulièrement lorsque cela est possible (il y a des situations où cela est difficile car il y a plusieurs chemins de retour dans la fonction que le retour différentes instances ).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top