开发者

Object returned from function and copy constructor

There is such code:

#include <iostream>

class A {
public:
    int a;
    A() : a(0) {
        std::cout << "Default constructor" << " " << this << std::endl;
    }
    A(int a_) :开发者_如何学C a(a_) {
        std::cout << "Constructor with param " << a_ << " " << this << std::endl;
    }
    A(const A& b) {
        a = b.a;
        std::cout << "Copy constructor " << b.a << " to " << a << " " << &b << " -> " << this << std::endl;
    }
    A& operator=(const A& b) {
        a=b.a;
        std::cout << "Assignment operator " << b.a << " to " << a << " " << &b << " -> " << this <<  std::endl;
    }
    ~A() {
        std::cout << "Destructor for " << a << " " << this << std::endl;
    }
    void show(){
      std::cout << "This is: " << this << std::endl;
    }
};


A fun(){
  A temp(3);
  temp.show();
  return temp;
}


int main() {
    {
      A ob = fun();
      ob.show();
    }
    return 0;
}

Result:

Constructor with param 3 0xbfee79dc
This is: 0xbfee79dc
This is: 0xbfee79dc
Destructor for 3 0xbfee79dc

Object ob is initialized by function fun(). Why copy constructor is not called there? I thought that when function returns by value then copy constructor or assignment operator is called. It seems that object constructed in function fun() is not destroyed after execution of function. How can be copy constructor forced to invoke in this case?

This was compiled by g++.


Why copy constructor is not called there?

RVO

How can be copy constructor forced to invoke in this case?

Pass an option to the compiler. For gcc, it is --no-elide-constructors option to disable the RVO


That is called Named Return Value Optimization and copy elision, and basically means that the compiler has figured out that the copy can be avoided by carefully placing the temporary and the object in the same memory location.

By default there would be three objects in that piece of code, temp inside fun, the return value and ob inside main, and as many as two copies, but by carefully placing temp in the same memory location as the returned object inside fun and placing ob in the same memory address the two copies can be optimized away.

I wrote about those two optimizations with a couple of pictures to explain what is going on here:

  • NRVO
  • Copy elision
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜