How to “return an object” in C++?

后端 未结 8 650
礼貌的吻别
礼貌的吻别 2020-11-22 09:25

I know the title sounds familiar as there are many similar questions, but I\'m asking for a different aspect of the problem (I know the difference between having things on t

8条回答
  •  故里飘歌
    2020-11-22 09:42

    I don't want to return a copied value because it's inefficient

    This may not be true. Compilers can do optimisation to prevent this copying.

    For example, GCC does this optimisation. In the following program, neither move constructor nor copy constructor are called, since no copying or moving is done. Also, notice the address of c. Even though the object c is instantiated inside the function f(), c resides in the stack frame of main().

    class C {
    public:
        int c = 5;
        C() {}
        C(const C& c) { 
            cout << "Copy constructor " << endl;
        }
        C(const C&& c)  noexcept {
            cout << "Move Constructor" << endl;
        }
    };
    
    C f() {
        int beforeC;
        C c;
        int afterC;
    
        cout << &beforeC << endl;   //0x7ffee02f26ac
        cout << &c << endl;         //0x7ffee02f2710 (notice: even though c is instantiated inside f(), c resides in the stack frame of main()
        cout << &afterC << endl;    //0x7ffee02f26a8
    
        return c;
    }
    
    C g() {
        C c = f(); ///neither copy constructor nor move constructor of C are called, since none is done
        cout << &c << endl;  //0x7ffee02f2710
        return c;
    }
    
    int main() {
        int beforeC;
        C c = g();    ///neither copy constructor nor move constructor of C are called, since none is done
        int afterC;
    
        cout << &beforeC << endl; //0x7ffee02f2718 
        cout << &c << endl;       //0x7ffee02f2710 (notice:even though c is returned from f,it resides in the stack frame of main)
        cout << &afterC << endl;  //0x7ffee02f270c
        return 0;
    }
    

提交回复
热议问题