我不是C ++的专家,我正在寻找从函数返回值的最快方法。 例如,要将值作为函数arguemnt传递,最快的方法是const引用:
void foo(const bar& parameter);
可以用返回值做这样的事吗?如果我返回一个引用,可能是这样的:
bar& foo();
我可以在运行时遇到任何问题,因为引用的变量不再存在(因为函数foo已经结束)。谢谢你的建议,抱歉我的英文不好
答案 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返回对象的字段,而不是函数的局部变量。
并且要注意仅在对象的生命期间保留参考。