我有以下方法,它按值返回本地声明的对象:
Human Human::getLocalDeclaredHuman() {
Human human;
std::cout << &human << std::endl;
return human;
}我称之为这种方法:
Human a;
Human b = a.getLocalDeclaredHuman();
std::cout << &b << std::endl;
std::cout << b.getName() << std::endl;这是正在运行的程序的输出:
0x22fe58
0x22fe58
无名氏
因此,在方法中声明为局部变量的变量human与变量b具有相同的地址。我认为return-by-value将创建对象的副本,而对象b具有另一个地址,类似于本地声明的对象human。
我的问题是:
如果这里b和人工有相同的地址,那么按值返回和按引用返回的区别在哪里?
发布于 2012-02-22 17:39:49
这是因为编译器执行的返回值优化。
发布于 2012-02-22 17:41:03
副本很可能被省略到外部作用域,因此被调用的唯一方法是默认的人工复制构造函数。要获得更多信息,请查看此问题。
发布于 2012-02-22 17:40:12
这是返回值优化。编译器知道您将使用它做什么,所以已经在分配它的位置创建了它,所以它不需要复制。
https://stackoverflow.com/questions/9400018
复制相似问题