Const 函数的参数:它是否应该通过引用传递?
Const function's parameters: should it be passed by reference or not?
我最近去面试一份程序工作,他们让我写一些函数,将向量和整数作为参数。任务是计算向量中高于、低于或等于整数的元素数。我写了一些关于这些内容的内容:
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) {}
老实说,我一直使用第一个版本(顶部)编写代码,并且没有真正的论据来解释为什么我的方法会更好或与他们的方法没有什么不同。他们的论点是,通过引用传递参数会强制以后在您想要变量内容时取消引用变量,这比我按值传递变量要慢。
所以我的问题是:最好的方法是什么,原因是什么?
奖励问题:他们还认为,在循环中使用迭代器比使用 []
运算符访问向量的元素更有效。我看不出有任何理由,特别是因为我怀疑在第 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;
}
以允许复制省略和移动语义。
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 无法将右值引用函数与 GCC 匹配
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- 通过引用函数传递指针参数是什么意思?
- 常量引用函数参数的地址何时唯一?
- 我想了解为什么在这个例子中使用引用函数?或者引用在c++函数中的重要性
- C++ 通过引用函数传递数组,但内容保持不变
- 用数组或指针引用函数?
- 引用函数如何"int &foo();"工作?
- 常量引用函数参数:是否可以禁止临时对象?
- 计算在代码中引用函数的次数
- <initializer_list> 引用函数
- 字符串引用(函数)的差异
- 在类中引用函数时的"No Matching Function for Call"
- 无法通过引用函数"calcValues"中"firstNum"和"secondNum"变量来更改值
- 尝试引用已删除的函数(不引用函数)
- 引用函数指针
- 引用函数按值和自动返回
- 为什么我们可以取消引用函数指针
- 通过引用函数传递值的目的是什么