为什么传递值而不是const引用?

Joh*_*son 9 c++ arguments const function

由于const引用与传递值几乎相同,但没有创建副本(据我所知).那么是否需要创建变量的副本(因此我们需要使用pass by value).

Ker*_* SB 14

在某些情况下,您不需要修改输入,但仍需要输入的内部副本,然后您也可以按值获取参数.例如,假设您有一个返回向量的已排序副本的函数:

template <typename V> V sorted_copy_1(V const & v)
{
    V v_copy = v;
    std::sort(v_copy.begin(), v_copy.end());
    return v;
}
Run Code Online (Sandbox Code Playgroud)

这很好,但如果用户有一个他们从不需要用于任何其他目的的向量,那么你必须在这里制作一个可能不必要的强制拷贝.所以只需按值进行参数:

template <typename V> V sorted_copy_2(V v)
{
    std::sort(v.begin(), v.end());
    return v;
}
Run Code Online (Sandbox Code Playgroud)

现在,生成,分类和返回矢量的整个过程可以基本上"就地"完成.

较便宜的示例是消耗计数器或迭代器的算法,这些算法需要在算法的过程中进行修改.再次,按值获取这些允许您直接使用函数参数,而不是需要本地副本.


Nei*_*irk 5

  1. 通过值传递基本数据类型(如整数,浮点数和指针)通常会更快.
  2. 您的函数可能希望在本地修改参数,而不会更改传入的变量的状态.
  3. C++ 11引入了移动语义.要将对象移动到函数参数中,其类型不能是const引用.


Mat*_*son 5

像很多东西一样,这是一种平衡.

我们通过const引用来避免制作对象的副本.

当你传递一个const引用时,你传递一个指针(引用是带有额外糖的指针,使它们的味道更少苦).当然,假设对象很容易复制.

要访问引用,编译器必须取消引用指针以获取内容[假设它无法内联并且编译器优化了取消引用,但在这种情况下,它还将优化掉额外的副本,因此有也没有因价值而损失的情况.

因此,如果您的副本比解除引用和传递指针的总和"更便宜",那么当您通过值传递时,您将"获胜".

当然,如果你打算复制一个副本,那么你也可以在构造参数时制作副本,而不是稍后明确复制.