首页 >后端开发 >C++ >想要速度吗?按价值传递:复制消除总是性能赢家吗?

想要速度吗?按价值传递:复制消除总是性能赢家吗?

Linda Hamilton
Linda Hamilton原创
2024-10-26 11:59:031050浏览

 Want Speed? Pass By Value: Is Copy Elision Always the Performance Winner?

想要速度吗?按值传递:性能注意事项

“想要速度?按值传递”的原则表明,按值传递参数有时可以由于复制省略而提高性能。为了说明这一点,请考虑以下使用类 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) {}
};

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

这里,foo() 返回一个传递给 X 和 Y 构造函数的临时字符串。当 X 初始化 mem_name 时,它​​会调用 std::string 的移动构造函数,这可能会避免复制字符串。但是,当 Y 初始化 mem_name 时,它​​必须复制字符串引用。

左值与右值参数:

如果传递左值(非临时),则 X Y 将执行复制。此外,X 将执行一个动作。对于右值(临时值),X 只能执行移动,而 Y 仍必须执行复制。

性能影响:

通常,移动比传递更快指针(相当于通过引用传递)。因此,X 的左值性能与 Y 相似,而右值性能更好。

注意:

虽然“想要速度?按值传递”是一个引人注目的想法,应当谨慎地应用它。必须考虑与复制大型数据结构相关的特定上下文和潜在开销。建议进行分析以确定实际的性能影响。

其他资源:

  • [Scott Meyer 的 GN13 演讲](https://www.youtube.com /watch?v=uk3-zmJWt-E)(时间范围 8:10 和 8:56)
  • [juanchopanza 的博客:“想要速度?不要(总是)传递价值”]

以上是想要速度吗?按价值传递:复制消除总是性能赢家吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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