最快的C ++返回值的方法

时间:2014-03-13 09:41:07

标签: c++

我不是C ++的专家,我正在寻找从函数返回值的最快方法。 例如,要将值作为函数arguemnt传递,最快的方法是const引用:

void foo(const bar& parameter);

可以用返回值做这样的事吗?如果我返回一个引用,可能是这样的:

bar& foo();

我可以在运行时遇到任何问题,因为引用的变量不再存在(因为函数foo已经结束)。谢谢你的建议,抱歉我的英文不好

4 个答案:

答案 0 :(得分:4)

我认为最好和最干净的方法是依靠编译器执行RVO复制省略。这是优化可以改变可观察行为的少数例外之一,并且在现代流行的编译器中被广泛使用。

返回引用可能不合适,因为您需要确保返回后对象存在。这对于返回类的属性的方法来说很好。但是如果使用函数创建对象并不容易。

除此之外,您当然可以返回一个指针。但是有人必须释放对象,或者你需要使用某种智能指针。

关于std::move,只要你想要“快速返回”并且不信任编译器,盲目地使用它就不是一个好主意。请参阅:When should std::move be used on a function return value?

重申IMO,最好的方法是编写允许(N)RVO并信任编译器的代码。

答案 1 :(得分:1)

确实你会遇到问题。只有在返回的对象的生命周期不限于函数的范围时才能执行此操作(例如,您可以返回对对象成员的引用)。

对于按值返回的小POD对象通常没有问题。对于更复杂的对象,尤其是动态内存分配,使用C ++ 11的移动语义是最好的方法。如果你的栏定义了一个移动构造函数并按值返回它,那么如果你从函数中按值返回一个实例,它将被自动使用(而不是复制构造函数)。

编辑:我同意所有其他人说RVO是最佳选择,但是如果"可能会复制elision"不够好(即非常昂贵的副本)你应该实现一个移动构造函数。

答案 2 :(得分:1)

按值返回并帮助编译器执行RVO是最好的。

“帮助”编译器以确保函数始终返回相同的声明实例(并且从不依赖于任何条件的任何其他实例)的一种方式。

对于isntance do

bar f() {
  bar revtal;
  ..
  return retval
}

但不是

bar f() {
  bar retval1;
  bar retval2;
  if(somecondition)
     return retval1;
  else return
     retval2;

}

答案 3 :(得分:0)

是的,可以返回引用,但take care of return a reference返回对象的字段,而不是函数的局部变量。

并且要注意仅在对象的生命期间保留参考。