“想要速度?传递价值”和性能优化
在处理大量复制操作时,开发人员通常会努力优化性能。这一前提引出了斯科特·迈耶斯 (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中文网其他相关文章!