如果将函数 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());
执行安全吗?
MakeObj() 的 'Object' return 值存储在哪里?我可以使用对该存储的引用吗?
或者需要一个临时变量:
Object MakeObj(){/* processsing */};
Object ChangeObj(const Object& obj){/* processsing */};
Object tmp_obj = MakeObj();
Object test_obj = ChangeObj(tmp_obj);
如果更改第 3 点中的代码,是否有任何性能提升或完全相同:
Object MakeObj(){/* processsing */};
Object ChangeObj(Object obj){/* processsing */}; //No reference here, so 'Object' value is created.
Object test_obj = ChangeObj(MakeObj());
有没有办法使用“移动”来避免处理大对象?例如:
Object ChangeObj(Object&& obj){/* processsing */};
如果是,它会是什么样子?
以上这两个功能的最快实现方式(尽可能少应对)是什么?假设:“对象 MakeObj();”声明不能更改。
执行是安全的,因为const reference extends object lifetime(or here)
对象本身存储在栈的某处,但只要const引用存在就不会被擦除(compare asm line 20(non-reference) and 25- 27(常量参考))
没有。没必要。
在一般情况下,第 4 点的代码更快,即使有 move
(在 vector
的情况下,优化 2-3赋值操作size_t
)
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
- 第 4 点的代码应该是最快的,但是要衡量!!!记住优化的第一条规则:不要过早优化
让我们考虑两个函数:
//Test functions
Object MakeObj(){/* processsing */};
Object ChangeObj(const Object& obj){/* processsing */};
//Then execute
Object test_obj = ChangeObj(MakeObj());
执行安全吗?
MakeObj() 的 'Object' return 值存储在哪里?我可以使用对该存储的引用吗?
或者需要一个临时变量:
Object MakeObj(){/* processsing */}; Object ChangeObj(const Object& obj){/* processsing */}; Object tmp_obj = MakeObj(); Object test_obj = ChangeObj(tmp_obj);
如果更改第 3 点中的代码,是否有任何性能提升或完全相同:
Object MakeObj(){/* processsing */}; Object ChangeObj(Object obj){/* processsing */}; //No reference here, so 'Object' value is created. Object test_obj = ChangeObj(MakeObj());
有没有办法使用“移动”来避免处理大对象?例如:
Object ChangeObj(Object&& obj){/* processsing */};
如果是,它会是什么样子?
以上这两个功能的最快实现方式(尽可能少应对)是什么?假设:“对象 MakeObj();”声明不能更改。
执行是安全的,因为const reference extends object lifetime(or here)
对象本身存储在栈的某处,但只要const引用存在就不会被擦除(compare asm line 20(non-reference) and 25- 27(常量参考))
没有。没必要。
在一般情况下,第 4 点的代码更快,即使有
move
(在vector
的情况下,优化 2-3赋值操作size_t
)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
- 第 4 点的代码应该是最快的,但是要衡量!!!记住优化的第一条规则:不要过早优化