Ich habe in this Artikel über NRVO gesucht.verständigen Kopie Konstruktor Aufrufe und benannte Rückgabewert-Optimierung
class RVO
{
public:
RVO(){
printf("I am in constructor\n"); }
RVO(const RVO& c_RVO) {
printf("I am in copy constructor\n"); }
~RVO(){
printf("I am in destructor\n"); }
int mem_var;
};
RVO MyMethod(int i)
{
RVO rvo;
rvo.mem_var = i;
return (rvo);
}
int main()
{
RVO rvo;
rvo=MyMethod(5);
}
Die Ausgabe ist die folgende auf Visual Studio und das ist, wie ich es verstehe
I am in constructor // main rvo construction
I am in constructor //MyMethod rvo construction
I am in copy constructor //temporary created inside MyMethod
I am in destructor //Destroying rvo in MyMethod
I am in destructor //Destroying temporary in MyMethod
I am in destructor //Destroying rvo of main
Wenn stattdessen i die Haupt als
int main()
{
RVO rvo = MyMethod(5);
return 0;
}
Der Ausgang ist der Schreib folgende und wie verstehe es
I am in constructor //MyMethod rvo construction
I am in copy constructor //temporary created inside MyMethod
I am in destructor //Destroying rvo in MyMethod
I am in destructor //Destroying rvo of main
Warum wird temporär in Mymethod
in der zweiten Version nicht zerstört?
Warum ist Copykonstruktor nicht in RVO rvo = MyMethod(5);
.Ich genannt denken Copy-Konstruktor sollte zweimal in der zweiten Version aufgerufen werden, eine für die temporäre innerhalb Mymethod
und die andere geschaffen für RVO rvo = MyMethod(5);
ich einige nennen wissen elided.Can jemand sein kann immer bitte Hilfe bei der Erklärung dieser Anrufe.
EDIT: Mit return rvo
statt return (rvo)
ändert sich die Ausgabe als
Erster Fall
I am in constructor
I am in constructor
I am in destructor
I am in destructor
zweiten Fall
I am in constructor
I am in destructor
Ich denke, wenn ich die Klammer entfernt, dann NRVO tritt in Aber ich interessiere mich mehr für die erste Ausgabe, wenn es keine Optimierung gibt
Es gibt etwas Fischiges über die Ausgabe des zweiten Beispiels. Jeder resonierbare Compiler sollte RVO anwenden, so dass Sie keinen Kopierkonstruktoraufruf erhalten sollten. –
@ Cheersandhth.-Alf siehe http://ideone.com/S5Kqn9 –
Entfernen Sie die Klammer um den Rückgabeausdruck. –