对于由值返回的变量的相同地址

Jan*_*ter 0 c++ methods reference

我有以下方法,通过值返回本地声明的Object:

Human Human::getLocalDeclaredHuman() {    
    Human human;
    std::cout << &human << std::endl;
    return human;
}
Run Code Online (Sandbox Code Playgroud)

我称之为这种方法:

Human a;
Human b = a.getLocalDeclaredHuman();
std::cout << &b << std::endl;
std::cout << b.getName() << std::endl;
Run Code Online (Sandbox Code Playgroud)

这是正在运行的程序的输出:
0x22fe58
0x22fe58
John Doe

因此,在方法中声明为local的变量human与变量b具有相同的地址.我认为按值返回将创建对象的副本,并且对象b具有另一个地址,例如在本地声明的对象人类.

我的问题:
如果这里b和人类有相同的地址,那么返回值和返回参考值之间的差异在哪里?

Rob*_*obᵩ 6

返回值优化.

调用者接收到对被调用者的局部变量的引用并没有那么多,而是编译器将调用者变量的引用隐藏到被调用者中!

getLocalDeclaredHuman.human从来没有真正存在过.编译器能够优化其存在并直接完成其所有工作b.

并且,直接回答你的问题,"按值返回和返回参考之间的差异在哪里?":在这种情况下,按值返回意味着单个对象的生命周期为b.如果您human通过引用返回,那么单个对象将具有生命周期human,即它将在getLocalDeclaredHuman()返回时被销毁.