【发布时间】:2013-11-08 15:38:39
【问题描述】:
我最近去面试一个程序工作,他们要求我编写一些函数,该函数将向量和整数作为参数。任务是计算向量中大于、小于或等于整数的元素数量。我按照这些思路写了一些东西:
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) {}
说实话,我一直使用第一个版本(在顶部)编写我的代码,并没有真正的论据来解释为什么我的方法会比他们的更好或没有什么不同。他们的论点是,通过引用传递参数会迫使稍后在您想要其内容时取消对变量的引用,这比我通过值传递变量时要慢。
所以我的问题是:最好的方法是什么,原因是什么?
奖励问题:他们还认为,在循环中使用迭代器会比使用 [] 运算符访问向量的元素更有效。我看不出有什么原因,尤其是我怀疑vec[i] 在第 5 行被访问两次时会在 L1 缓存中。
谢谢。
【问题讨论】:
-
哦,哇,一堆废话。显然,他们过于关心“效率”(而且他们似乎对它有一些模糊的定义)并且完全无视语义。我不会接受这份工作。
-
传递
const int&没有任何好处,但传递对std::vector的引用却有很多好处。 -
是的,我同意
int&,但与写const int val相比,这样做会受到惩罚吗? -
@user18490 是的,可能会受到惩罚 - 根据 Joachim 的回答,您最终可能会(有效地)传递一个 64 位指针而不是单个 32 位值。不过,这不会是一个重大的处罚。
-
@user18490:是的,通过引用传递(几乎可以肯定)需要额外的间接级别来访问对象。编译器可能会也可能不会优化它;如果您按值传递,则不必。对于像
vector这样的大型或复杂对象,复制的成本可能高于间接成本,因此您应该通过引用传递它。
标签: c++ performance pass-by-reference