复制构造函数在哪里(在内存中)复制函数的 return 值?
Where (in memory) does copy constructor copy the return value of function?
根据我目前对 C++ 的了解,复制构造函数在 3 种情况下被调用
- 当对象按值传递时
- 当一个函数return是一个对象时。
- 当用另一个相同类型的对象声明和初始化对象时。
#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();
我有三个问题
- returned 对象 c 复制到哪里?
- 为什么构造函数不直接将returned对象(即c)存储(复制)到c2中?效率会不会更高?
- 如果 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,则 c
和 c2
成为同一个对象。
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同时发生,c2
和c
是同一个对象,所以不需要移动。
根据我目前对 C++ 的了解,复制构造函数在 3 种情况下被调用
- 当对象按值传递时
- 当一个函数return是一个对象时。
- 当用另一个相同类型的对象声明和初始化对象时。
#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(); 我有三个问题
- returned 对象 c 复制到哪里?
- 为什么构造函数不直接将returned对象(即c)存储(复制)到c2中?效率会不会更高?
- 如果 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,则 c
和 c2
成为同一个对象。
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同时发生,c2
和c
是同一个对象,所以不需要移动。