c++ - 从函数调用传递参数或从变量传递参数之间的 C++ 区别
问题描述
这有什么区别:
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++ 还是涉及移动语义,都可以独立回答这个问题。简而言之:编写清晰易读的代码。当您拥有可以测量和分析的正确且有效的代码时,对效率的担忧是后期的。
推荐阅读
- c - 优化双循环
- python-3.x - python 3 csv 列表写入问题 - 当我添加新列表时,当前 csv 结构发生变化
- facebook - 我应该使用哪个访问令牌?
- angular - ScatterPlot ng2-nvd3 大黑圈
- file - 是否可以将 VichUploader 集成到 CKEditor 中?
- angularjs - HyperLedger Composer:未处理的错误
- android - 使用什么库与 Android TV Remote 服务集成?
- cmake - CMake 3.11 链接 CUBLAS
- android - 在我的手机上运行应用程序时不显示垂直线视图
- c# - 用户输入确认