在复制构造函数中创建临时对象

temporary object creation in copy constructor

本文关键字:创建 临时对象 构造函数 复制      更新时间:2023-10-16

我正在阅读c++中的复制构造函数

前面提到,使用按值调用和按值返回的方法传递对象,构造了一个用户永远不会看到的临时对象。我的理解是当我们调用val时例如

myclass b;
void myfunc(myclass c) {}  //c(b) copy constructor is called.

创建临时对象的位置?

谢谢!

myfunc()的作用域中创建副本。也就是说,c在整个函数的范围内,它包括(并且略大于)函数体。当函数返回时,即在myfunc(b);的分号处,副本被销毁。

在按值传递的情况下,将复制作为参数(而不是临时参数),因此在示例中的特定代码中,将有两个对象:

myclass b;
myfunc( b ); // b is copied to argument "c" by means of the copy constructor

在按值返回的情况下,事情有点复杂,在代码中:

type f() {
   type tmp;
   return tmp;     // copies into temporary (again, copy constructor)
}
int main() {
   type x = f();   // copies from temporary into x (copy constructor)
   x = f();        // copies from temporary into x (assignment operator)
}

理论上有3个类型为type的对象。在调用f之前,编译器将在调用约定定义的位置为type对象创建空间(这将是创建临时对象的位置),然后调用该函数并在f中创建tmp,它在返回语句中被复制到临时对象中。最后,将临时文件复制到mainx变量中。

但是,在许多情况下,编译器可以通过仔细选择变量的位置来优化这些临时变量。大多数编译器将能够优化前面示例中3个对象中的2个。

更详细的描述可以阅读:

  • http://definedbehavior.blogspot.com/2011/08/value-semantics-nrvo.html
  • http://definedbehavior.blogspot.com/2011/08/value-semantics-copy-elision.html