gpt4 book ai didi

c++ - 在 C++ 中通过值传递还是通过引用传递到 const 更好?

转载 作者:IT老高 更新时间:2023-10-28 11:27:28 25 4
gpt4 key购买 nike

在 C++ 中是通过值传递还是通过引用传递到 const 更好?

我想知道哪种做法更好。我意识到通过引用传递到 const 应该可以在程序中提供更好的性能,因为您没有制作变量的拷贝。

最佳答案

过去通常建议最佳实践1所有类型使用传递常量引用,内置类型(charintdouble 等),用于迭代器和函数对象(lambdas,派生自 std::*_function)。

移动语义存在之前尤其如此。原因很简单:如果按值传递,则必须制作对象的拷贝,除了非常小的对象外,这总是比传递引用更昂贵。

使用 C++11,我们获得了 move semantics .简而言之,移动语义允许在某些情况下,一个对象可以“按值”传递而不复制它。特别是,当您传递的对象是 rvalue 时,会出现这种情况。 .

就其本身而言,移动对象仍然至少与通过引用传递一样昂贵。然而,在许多情况下,一个函数无论如何都会在内部复制一个对象——即它会取得参数的所有权2

在这些情况下,我们有以下(简化的)权衡:

  1. 我们可以通过引用传递对象,然后在内部复制。
  2. 我们可以按值传递对象。

“按值传递”仍然会导致对象被复制,除非对象是右值。在右值的情况下,对象可以被移动,所以第二种情况突然不再是“复制,然后移动”而是“移动,然后(可能)再次移动”。

对于实现正确移动构造函数的大型对象(例如 vector 、字符串……),第二种情况大大比第一种更有效。因此,如果函数拥有参数的所有权,并且对象类型支持高效移动,建议使用传值方式


历史记录:

事实上,任何现代编译器都应该能够找出按值传递代价高昂的情况,并在可能的情况下将调用隐式转换为使用 const ref。

理论上。在实践中,编译器不能总是在不破坏函数的二进制接口(interface)的情况下改变它。在某些特殊情况下(当函数被内联时),如果编译器能够确定原始对象不会通过函数中的操作进行更改,则实际上会省略拷贝。

但通常编译器无法确定这一点,而 C++ 中移动语义的出现使这种优化的相关性大大降低。


1 例如在 Scott Meyers,Effective C++

2对于对象构造函数来说尤其如此,它可以接受参数并将它们存储在内部以作为构造对象状态的一部分。

关于c++ - 在 C++ 中通过值传递还是通过引用传递到 const 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/270408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com