复制省略误区
Copy Elision Misunderstanding
#include <iostream>
struct A
{
A() { std::cout << "Def Constr\n"; }
A(const A&) { std::cout << "Copy Constr\n"; }
};
A func1()
{
return A{};
}
void func2(A a) {}
int main()
{
func2(func1());
}
用
编译后
g++ Copy.cpp -std=c++11 -fno-elide-constructors
输出为:
Def Constr
Copy Constr
Copy Constr
我的问题是:为什么 2 Copy Constr?我以为只需要一份。
我可能会猜测 func1() 会抛出一个临时对象,这个临时对象需要复制到另一个内存区域,然后必须再次从该区域为 func2() 参数制作一个副本,但对于我.
能详细解释一下吗?
func1
的 return 值是从表达式 A{}
复制而来的。
- 函数调用表达式
func1()
的值被复制到func2
的函数参数中。
是的,你的理解是对的。您的代码行(没有复制省略)类似于
int main()
{
{
A temp = func1(); // 2nd copy
func2(temp); // 3rd copy
}
}
#include <iostream>
struct A
{
A() { std::cout << "Def Constr\n"; }
A(const A&) { std::cout << "Copy Constr\n"; }
};
A func1()
{
return A{};
}
void func2(A a) {}
int main()
{
func2(func1());
}
用
编译后g++ Copy.cpp -std=c++11 -fno-elide-constructors
输出为:
Def Constr
Copy Constr
Copy Constr
我的问题是:为什么 2 Copy Constr?我以为只需要一份。
我可能会猜测 func1() 会抛出一个临时对象,这个临时对象需要复制到另一个内存区域,然后必须再次从该区域为 func2() 参数制作一个副本,但对于我.
能详细解释一下吗?
func1
的 return 值是从表达式A{}
复制而来的。- 函数调用表达式
func1()
的值被复制到func2
的函数参数中。
是的,你的理解是对的。您的代码行(没有复制省略)类似于
int main()
{
{
A temp = func1(); // 2nd copy
func2(temp); // 3rd copy
}
}