[英]C++ difference between passing argument from a function call or passing argument from variable
这有什么区别:
function1(function2());
和这个:
var1 = function2();
function1(var1);
在效率或其他方面,最好的选择是什么?
在 C++11 之前没有大的区别。 由于引入了移动语义,因此差异可能很大。 当一个函数需要复制其参数时,它可以有两种重载:一种是实际复制,另一种是当参数是临时的时可以移动:
#include <iostream>
struct bar {};
bar b() { return {};}
struct foo {
bar b;
void set(const bar& in) {
std::cout << "copy \n";
b = in;
}
void set(bar&& in){
std::cout << "no need to copy, can move\n";
b = std::move(in);
}
};
int main() {
foo f;
bar b1;
f.set(b1);
f.set(b());
}
这个例子中的bar
只是一个轻量级的类,但是当它移动便宜但复制成本高时, f.set(b1)
的效率低于f.set(b())
。 调用者可以使用f.set(std::move(b1))
,但调用f.set(b())
而不是将移动的对象挂在周围更清晰。
但是,在 C++11 之前,您实际上应该问的问题是:为调用function2
的结果命名是否有意义? 你只需要结果来调用function1
还是你在其他地方也需要它? 这可以独立于您是否正在编写古老的 C++ 或是否涉及移动语义来回答。 简而言之:编写清晰易读的代码。 对效率的关注是在稍后的阶段,当您拥有可以衡量和分析的正确且有效的代码时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.