vendredi 1 janvier 2016

Object return by value is best way in c++?

//demo.h

#ifndef _DEMO_H_
#define _DEMO_H_

class Demo {

public:
    Demo();
    Demo(Demo const & d);
    Demo(Demo && d);
    Demo & operator=(Demo && d);
    Demo & operator=(const Demo & d);
    ~Demo();
};

#endif

//Demo.cpp

#include<iostream>
#include "Demo.h"

using namespace std;

Demo::Demo() {
    cout << this << " - Demo::Demo() "  << endl;
}

Demo::Demo(Demo const & d) {
    cout << this <<  " - Demo::Demo(Demo const & )" << endl;

}

Demo::Demo(Demo && d) {
    cout << this << " - Demo::Demo(Demo &&)" <<endl;
}


Demo & Demo::operator=(Demo && d) {
    cout << this << " - Demo::operator =(Demo && ) " << endl;
    return *this;

}

Demo & Demo::operator=(const Demo & d) {
    cout << this << " - Demo::operator=(const Demo & d) " <<endl;
    return *this;
}

Demo::~Demo() {
    cout << this << " - Demo::~Demo() " <<endl;
}

//return_demo.cpp

#include "Demo.h"
#include <utility>
#include <iostream>

using namespace std;

Demo fun(){ Demo s; return s; }
Demo  gun(){ return move(Demo{}); }
Demo && rrfun(){ Demo s; return move(s); }

int main(){
    cout << " ------ Demo fun(){ Demo s; return s; } " << endl;
    Demo x=fun();
    cout << " addres of return value is " << &x << endl;

    cout << "\n move -------------" <<endl ;
    Demo xm=move(fun());
    cout << " addres of return value is " << &xm << endl;

    cout << " \n------ Demo  gun(){ return move(Demo{}); } " << endl;
    Demo y=gun();
    cout << " addres of return value is " << &y << endl;

    cout << "\n move -------------" <<endl ;
    Demo ym=move(gun());
    cout << " addres of return value is " << &ym << endl;

    cout << " \n------ Demo && rrfun(){ Demo s; return move(s); } " << endl;
    Demo z=rrfun();
    cout << " addres of return value is " << &z << endl;

    cout << "\n move -------------" <<endl ;
    Demo zm=move(rrfun());
    cout << " addres of return value is " << &zm << endl;

cout << " ------------- main end -------------- " << endl;

return 0;
}

//out put

 ------ Demo fun(){ Demo s; return s; } 
0x7ffc6f560b78 - Demo::Demo() 
 addres of return value is 0x7ffc6f560b78

 move -------------
0x7ffc6f560b7a - Demo::Demo() 
0x7ffc6f560b79 - Demo::Demo(Demo &&)
0x7ffc6f560b7a - Demo::~Demo() 
 addres of return value is 0x7ffc6f560b79

------ Demo  gun(){ return move(Demo{}); } 
0x7ffc6f560b4f - Demo::Demo() 
0x7ffc6f560b7b - Demo::Demo(Demo &&)
0x7ffc6f560b4f - Demo::~Demo() 
 addres of return value is 0x7ffc6f560b7b

 move -------------
0x7ffc6f560b4f - Demo::Demo() 
0x7ffc6f560b7d - Demo::Demo(Demo &&)
0x7ffc6f560b4f - Demo::~Demo() 
0x7ffc6f560b7c - Demo::Demo(Demo &&)
0x7ffc6f560b7d - Demo::~Demo() 
 addres of return value is 0x7ffc6f560b7c

------ Demo && rrfun(){ Demo s; return move(s); } 
0x7ffc6f560b4f - Demo::Demo() 
0x7ffc6f560b4f - Demo::~Demo() 
0x7ffc6f560b7e - Demo::Demo(Demo &&)
 addres of return value is 0x7ffc6f560b7e

 move -------------
0x7ffc6f560b4f - Demo::Demo() 
0x7ffc6f560b4f - Demo::~Demo() 
0x7ffc6f560b7f - Demo::Demo(Demo &&)
 addres of return value is 0x7ffc6f560b7f
 ------------- main end -------------- 
0x7ffc6f560b7f - Demo::~Demo() 
0x7ffc6f560b7e - Demo::~Demo() 
0x7ffc6f560b7c - Demo::~Demo() 
0x7ffc6f560b7b - Demo::~Demo() 
0x7ffc6f560b79 - Demo::~Demo() 
0x7ffc6f560b78 - Demo::~Demo() 

we are reusing the same object which is created inb fun() and no constructor is called while returning object ( ellison rule )

Demo fun(){ Demo s; return s; } 

we are calling move constructor while returning object and a new object is created in below functions

Demo  gun(){ return move(Demo{}); }
Demo && rrfun(){ Demo s; return move(s); }

from the above demo program and output can we assume that object return by value is better then returning the by move // rvale reference ??

Aucun commentaire:

Enregistrer un commentaire