如果将函数 return 值传递给函数引用参数,C++ 中会发生什么情况?

What happens in C++ if a function return value is passed to a function reference argument?

让我们考虑两个函数:

//Test functions
Object MakeObj(){/* processsing */};
Object ChangeObj(const Object& obj){/* processsing */};
//Then execute
Object test_obj = ChangeObj(MakeObj());
  1. 执行安全吗?

  2. MakeObj() 的 'Object' return 值存储在哪里?我可以使用对该存储的引用吗?

  3. 或者需要一个临时变量:

    Object MakeObj(){/* processsing */};
    Object ChangeObj(const Object& obj){/* processsing */};
    Object tmp_obj = MakeObj();
    Object test_obj = ChangeObj(tmp_obj);
    
  4. 如果更改第 3 点中的代码,是否有任何性能提升或完全相同:

    Object MakeObj(){/* processsing */};
    Object ChangeObj(Object obj){/* processsing */}; //No reference here, so 'Object' value is created.
    Object test_obj = ChangeObj(MakeObj());
    
  5. 有没有办法使用“移动”来避免处理大对象?例如:

    Object ChangeObj(Object&& obj){/* processsing */};
    

    如果是,它会是什么样子?

  6. 以上这两个功能的最快实现方式(尽可能少应对)是什么?假设:“对象 MakeObj();”声明不能更改。

  1. 执行是安全的,因为const reference extends object lifetime(or here)

  2. 对象本身存储在栈的某处,但只要const引用存在就不会被擦除(compare asm line 20(non-reference) and 25- 27(常量参考))

  3. 没有。没必要。

  4. 在一般情况下,第 4 点的代码更快,即使有 move(在 vector 的情况下,优化 2-3赋值操作size_t)

  5. move只能应用在第3点的代码中,然后会变成

Object MakeObj(){/* processsing */};
Object ChangeObj(Object&& obj){/* processsing */};
Object tmp_obj = MakeObj();
Object test_obj = ChangeObj(std::move(tmp_obj));
//here tmp_obj is no longer valid
  1. 第 4 点的代码应该是最快的,但是要衡量!!!记住优化的第一条规则:不要过早优化