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

Fastest C++ way to return a value

本文关键字:方法 返回值 c++      更新时间:2023-10-16

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

void foo(const bar& parameter);

是可能做这样的东西与返回值?如果我返回一个引用,可能是这样的:

bar& foo();

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

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

返回引用可能不合适,因为您需要确保该对象在返回之后存在。这适用于返回类属性的方法。但是,如果对象是在函数中创建的,就不那么容易了。

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

关于std::move,当你想要"快速返回"并且不信任编译器时,盲目地使用它并不是一个好主意。参考:std::move何时用于函数返回值?

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

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

一种"帮助"编译器确保函数总是返回相同的声明实例(而不是任何其他实例-当依赖于任何条件时)的方法。

For instance do

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

但不

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

确实会有问题。只有在返回对象的生命周期不受函数作用域限制的情况下(例如,可以返回对对象成员的引用),才能执行此操作。

对于小型pod对象按值返回通常没有问题。对于更复杂的对象,特别是动态内存分配,使用c++ 11的move语义是最好的方法。如果你的bar定义了一个move构造函数,你按值返回它,如果你从函数中按值返回一个实例,它将被自动使用(而不是复制构造函数)。

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

可以返回引用,但要注意返回对对象字段的引用,而不是函数的局部变量。

并且注意只在对象的生命周期内维护引用