我最近去面试一份程序工作,他们要求我编写一些将 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++ 专家的意见。他们说通过引用传递 vec
和 val
比通过值传递效率低。如果这样写会更好:
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/