从函数调用传递参数或从变量传递参数之间的 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语言中,定义一个函数的形参和实参之间具体是如何进行参数传递的?

从 C# 到 C++ 的调用无法正确传递参数

从 C++ 传递函数指针以由 C# 调用 - 函数参数包括宽字符字符串 (LPCWSTR)

c++中如何用函数传递fstream类型

调用函数和被调用函数之间的参数传递是通过啥来传的

C语言中,结构体作为函数参数传递,详解?