我一直在使用按引用返回来尝试加速我的代码并避免多次昂贵的复制操作。
我有一个访问成员函数,如下所示:
std::string const& access_element(int index) const;
如果我有另一个调用access_element()的成员函数,是否还需要通过引用返回它?
例如。
float const& access_element2(int index) const {
return atof(access_element(index));
}
与
float access_element2(int index) {
return atof(access_element(index));
}
答案 0 :(得分:3)
您将通过引用返回临时值。 在这种情况下,你的瓶颈是atof,而不是返回副本。 atof返回临时值。如果您的目的是通过引用返回加速,则应该返回一个成员对象,或者通过引用返回的成员对象(如向量项)的成员对象。
float const& access_element2(int index) const {
return elements[index];
}
答案 1 :(得分:3)
这是一篇好文章:Want Speed? Pass by Value.
另外,你真的需要小心通过引用返回。引用就像指针一样,你可以获得不合法使用的悬挂引用。以下是未定义的行为:
int const &foo() {
return 1;
}
此外,当传递基本类型如float
时,通常最好只复制它们,因为传递指针意味着你将复制指针,这不可能比复制值本身更快。这个答案有一个很好的经验法则,可以通过引用和值来获取参数:https://stackoverflow.com/a/1567186/365496
通过const &
而不是按值传递的另一个原因是,复制可能需要堆内存分配。这样的副本可能会失败,因此最好通过引用来避免错误的可能性。