Const 函数的参数:它是否应该通过引用传递?

Const function's parameters: should it be passed by reference or not?

本文关键字:引用 函数 参数 是否 Const      更新时间:2023-10-16

我最近去面试一份程序工作,他们让我写一些函数,将向量和整数作为参数。任务是计算向量中高于、低于或等于整数的元素数。我写了一些关于这些内容的内容:

void printStat(const std::vector<int> &vec, const int &val)
{
    int results[3] = {0,0,0};
    for (int i = 0; i < vec.size(); ++i) {
        int option = (vec[i] == val) ? 0 : ((vec[i] > val) ? 1 : 2);
        results[option]++;
    }
    ...
}

他们对代码发表了一些评论,我觉得这些评论是可疑的,我想知道C++专家的意见。他们说,通过引用传递vecval的效率低于价值。最好写:

void printStat(const std::vector<int> vec, const int val) {}

老实说,我一直使用第一个版本(顶部)编写代码,并且没有真正的论据来解释为什么我的方法会更好或与他们的方法没有什么不同。他们的论点是,通过引用传递参数会强制以后在您想要变量内容时取消引用变量,这比我按值传递变量要慢。

所以我的问题是:最好的方法是什么,原因是什么?

奖励问题:他们还认为,在循环中使用迭代器比使用 [] 运算符访问向量的元素更有效。我看不出有任何理由,特别是因为我怀疑在第 1 行访问两次时vec[i]将在 L5 缓存中。

谢谢。

这取决于

您将如何使用vec .如果向量中没有很多条目,则可以按值传递它,因为复制会非常快。但一般来说,通过引用传递它更"有效"。

另一方面,val参数,对于本机类型,通常不需要将它们作为常量引用传递。实际上,由于引用通常(如果不是总是?)在后台实现为指针,因此将此参数作为引用传递将在 64 位机器上传递 64 位值,而普通 int 的 32 位值。由于这是一个指针,它也将使用额外的间接寻址。

通过 ref 传递内置类型的对象会导致额外的负载。只需使用 const int val,如果你想防止它被修改。通过引用使用 std::vector 似乎绝对有效。

我会坚持通过常量引用传递对象。一个例外是,如果无论如何都要复制(const T 没有意义,除了防止函数实现中的意外更改)。

但是:我改变了实现operator =的方式。

T& operator=(const T& other) {
   T(other).swap(*this);
   return *this;
}

T& operator=(T other) {
   other.swap(*this);
   return *this;
}

以允许复制省略和移动语义。