首页  >  文章  >  后端开发  >  “想要速度?按值传递”总是正确的:按引用传递何时优于按值传递?

“想要速度?按值传递”总是正确的:按引用传递何时优于按值传递?

Barbara Streisand
Barbara Streisand原创
2024-10-26 17:09:03715浏览

Is

“想要速度?传递价值”和性能优化

在处理大量复制操作时,开发人员通常会努力优化性能。这一前提引出了斯科特·迈耶斯 (Scott Meyers) 创造的格言“想要速度?按价值传递”。然而,这个概念提出了一个问题:按值传递是否总是比按引用传递具有性能优势?

考虑以下类 X 和 Y:

<code class="cpp">struct X {
    std::string mem_name;

    X(std::string name) : mem_name(std::move(name)) {}
};

struct Y {
    std::string mem_name;

    Y(const std::string& name) : mem_name(name) {}
};</code>

在 X 中,构造函数获取参数的副本并使用移动构造函数来初始化其成员变量 mem_name。在 Y 中,构造函数采用 const 引用并直接从参数初始化 mem_name。

现在,让我们检查一下使用这些类的场景:

<code class="cpp">std::string foo() { return "a" + std::string("b"); }

int main() {
    X(foo());
    Y(foo());
}</code>

函数 foo() 返回 a用于初始化 X 中的 name 和 Y 中的 mem_name 的临时值。

对于 X,编译器可以优化 foo() 的构造并将其返回值直接放入 name 中。然后,它将 name 移动到 mem_name 中。此过程导致单次移动,没有任何副本。

相反,Y 无法执行此优化。它将 foo() 的临时返回值绑定到其引用名称,然后将该值复制到 mem_name 中。因此,Y 执行复制。

总之,当传递右值(临时对象)时,在 X 中按值传递有可能将过程优化为单个移动,而在 Y 中按引用传递则需要复制。但是,需要注意的是,这种优化取决于编译器的功能,并且始终建议进行分析以确定实际的性能影响。

以上是“想要速度?按值传递”总是正确的:按引用传递何时优于按值传递?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn