从函数调用传递参数或从变量传递参数之间的 C++ 区别
Posted
技术标签:
【中文标题】从函数调用传递参数或从变量传递参数之间的 C++ 区别【英文标题】:C++ difference between passing argument from a function call or passing argument from variable 【发布时间】:2021-12-07 23:21:09 【问题描述】:这有什么区别:
function1(function2());
还有这个:
var1 = function2();
function1(var1);
就效率或其他方面而言,最佳选择是什么?
【问题讨论】:
function1(function2());
?正如目前所写的那样,比较没有意义
是的,对不起,我编辑了它
这主要取决于var1
的类型,但function1(function2());
复制数据的次数会更少:) 就清晰的代码而言,保留var1
可能会更好(名称更好) 并将其作为参考甚至常量参考传递
【参考方案1】:
在 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++ 还是涉及移动语义,都可以独立回答这个问题。简而言之:编写清晰易读的代码。当您拥有可以测量和分析的正确且有效的代码时,对效率的担忧是后期的。
【讨论】:
如果 set 会像这样复制而不是 const ref 怎么办:void set(bar in)
? :)
@Raffallo 不确定我是否理解您的意思。如果set
通过复制获取参数,那么它确实会复制并且不能从移动语义中受益。这真的取决于function1
是什么,但不知道它可以移动或复制是一个有效的假设以上是关于从函数调用传递参数或从变量传递参数之间的 C++ 区别的主要内容,如果未能解决你的问题,请参考以下文章
在C语言中,定义一个函数的形参和实参之间具体是如何进行参数传递的?