复制构造函数在哪里(在内存中)复制函数的 return 值?

Where (in memory) does copy constructor copy the return value of function?

根据我目前对 C++ 的了解,复制构造函数在 3 种情况下被调用

  1. 当对象按值传递时
  2. 当一个函数return是一个对象时。
  3. 当用另一个相同类型的对象声明和初始化对象时。
#include "Cube.h"
using uiuc::Cube; 
Cube foo()
 {
  Cube c; 
 return c;    //copy constructor is invoked (BUT where is this copied value stored?)
}
int main()
 {
  Cube c2 = foo();  // copy constructor is invoked yet again !!! 
 return 0;
}

在上面的代码中,复制构造函数被调用了两次。 第一次为 return c;第二次是 Cube c2 = foo(); 我有三个问题

  1. returned 对象 c 复制到哪里?
  2. 为什么构造函数不直接将returned对象(即c)存储(复制)到c2中?效率会不会更高?
  3. 如果 returned 对象 c 没有存储在像 c2 这样的变量中,为什么仍然调用复制构造函数?

In the above code, copy constructor is invoked two times

如果您的类型有移动构造函数,在这种情况下将使用它代替复制构造函数。

在任何情况下,这里移动(或复制)构造函数被调用 0 次或 1 次,具体取决于编译器优化(在 C++17 之前也可能是 2 次)。

您从 2 个移动开始:首先 c 移动到一个临时对象,然后将该临时对象移动到 c2

第二步可以优化掉,这叫做RVO。从 C++17 开始,此优化是强制性的。

第一步也可以优化掉,但编译器不需要这样做。这叫做NRVO.

当移动(或复制)被“优化掉”时,它是通过使源和目标成为同一对象来实现的。所以,例如如果同时发生 RVO 和 NRVO,则 cc2 成为同一个对象。

Where is returned object c copied to?

Why does not the constructor directly store (copy) the returned object(i.e c) in c2 ?

如果 RVO 和 NRVO 没有发生,它被移动到一个临时对象。

如果发生 RVO,将移至 c2

如果RVO和NRVO同时发生,c2c是同一个对象,所以不需要移动。