繁体   English   中英

从函数调用传递参数或从变量传递参数之间的 C++ 区别

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM