首页 > 解决方案 > 从函数调用传递参数或从变量传递参数之间的 C++ 区别

问题描述

这有什么区别:

function1(function2());

还有这个:

var1 = function2();
function1(var1);

就效率或其他方面而言,最佳选择是什么?

标签: c++functionvariablesarguments

解决方案


在 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++ 还是涉及移动语义,都可以独立回答这个问题。简而言之:编写清晰易读的代码。当您拥有可以测量和分析的正确且有效的代码时,对效率的担忧是后期的。


推荐阅读