c++ - Const 函数的参数 : should it be passed by reference or not?

标签 c++ performance pass-by-reference

我最近去面试一份程序工作,他们要求我编写一些将 vector 和整数作为参数的函数。任务是计算 vector 中高于、低于或等于整数的元素数。我按照这些思路写了一些东西:

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) {}

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

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

红利问题:他们还争辩说,在循环中使用迭代器比使用 [] 运算符访问 vector 元素更有效。我看不出有任何原因,尤其是我怀疑 vec[i] 在第 5 行被访问两次时将在 L1 缓存中。

谢谢。

最佳答案

这取决于您将如何使用 vec。如果 vector 中没有很多条目,可以按值传递它,因为复制速度非常快。但通常通过引用传递它更“有效”。

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

关于c++ - Const 函数的参数 : should it be passed by reference or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19658963/

相关文章:

C++ 使用 std::remove_if 删除二维 vector 的元素

performance - 方法 v Hadoop MapReduce 中的类级变量

java - 多线程访问的单例类中的实例变量

c - 如何通过引用将结构数组传递给函数?

php - 以 "& $x"参数传递的函数输出一个值而不是错误,请参见下面的代码

c++强制隐式转换作为参数传递

c++ - 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐,可能有 operator new 等)

boost ptr_vector 的 C++ 成员模板

java - 我需要 BigInteger 的可变版本,但无法访问 mutablebiginteger

c - 将非动态二维数组传递给 C 中的函数?