c++ - 按值返回的变量的相同地址

标签 c++ methods reference

我有以下方法按值返回本地声明的对象:

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和human有相同的地址,按值返回和按引用返回的区别在哪里?

最佳答案

Return Value Optimization .

与其说是调用者收到了对被调用者局部变量的引用,不如说是编译器将对调用者变量的引用偷偷放到了被调用者中!

getLocalDeclaredHuman.human 从未真正存在过。编译器能够优化它的存在并直接在 b 上完成所有工作。

并且,直接回答您的问题,“按值返回和按引用返回之间的区别在哪里?”:在这种情况下,按值返回意味着单个对象的生命周期为 b。如果您要通过引用返回 human,则该单个对象将具有 human 的生命周期,即当 getLocalDeclaredHuman() 返回时它将被销毁.

关于c++ - 按值返回的变量的相同地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9400018/

相关文章:

java - 哪个 Java 方法调用了我的构造函数?

java - 我可以得到一个类的所有方法吗?

struct - 我可以限制结构的生命周期污染吗?

c# - 如何从另一个类引用 3D 数组?

c++ - 专攻一个参数的两个模板参数(C++ 模板)

c++ - 更改 std::unique_ptr 的删除器

c++ - 如何使用 HKLM\SYSTEM\CurrentControlSet\Enum 获取设备列表及其参数?

c++ - 两阶段名称查找 : PODs vs. 自定义类型

java - (字符);这段代码的目的是什么?

c# - 使用 C# 预处理器添加引用