如何找出创建和销毁临时对象的时间以及如何?
举个例子,假设我们有一个名为Foo
的类
和一个返回Foo
对象的函数,它的参数是一个对象,一个对象的引用。
Foo func(Foo a ,Foo & b);
我知道创建了多少个对象?
它是使用复制构造函数还是常规创建的?
答案 0 :(得分:3)
使用构造函数和析构函数,在其中插入print语句。
#include <iostream>
class Foo
{
public:
Foo(){}
Foo(const Foo &other) {std::cout<<"A copy was made\n";}
Foo(Foo &&other) {std::cout<<"Foo was moved\n";}
~Foo(){std::cout<<"Destroyed Foo\n";}
};
Foo func(Foo a, Foo &b)
{
return a;
}
Foo func_const(const Foo &a, Foo &b)
{
return a;
}
Foo func_temp()
{
return Foo();
}
int main()
{
Foo f;
func(f, f);
std::cout<<"\n\n\n";
func_const(f, f);
std::cout<<"\n\n\n";
Foo g = func_temp();
}
以上打印(使用ideone):
Foo constructed
A copy was made
Foo was moved
Destroyed Foo
Destroyed Foo
A copy was made
Destroyed Foo
Destroyed Foo
Destroyed Foo
使用功能签名:
Foo func(Foo a, Foo &b)
,参数a
可以制作副本。编译器的优化也可以省略该副本。参数b
永远不会复制,因为它是通过引用传递的,并且通常表示您将修改传递的对象;不修改副本。
返回Foo时,它可能会也可能不会返回副本。这取决于你班级的定义。见http://en.wikipedia.org/wiki/Return_value_optimization