c++ - 返回与不返回函数?

标签 c++ function return performance code-readability

返回还是不返回,是函数的问题!或者,这真的重要吗?


故事是这样的: 我曾经写过如下代码:

Type3 myFunc(Type1 input1, Type2 input2){}

但最近我的项目学院告诉我,我应该尽量避免写这样的函数,并建议将返回值放在输入参数中。

void myFunc(Type1 input1, Type2 input2, Type3 &output){}

他们说服我,这是更好更快的方法,因为在第一种方法中返回时有额外的复制步骤。


对我来说,我开始相信第二种方法在某些情况下更好,尤其是我有多个要返回或修改的东西。例如:由于避免复制整个 vecor<int>,第二行将比第一行更好更快回来的时候。

vector<int> addTwoVectors(vector<int> a, vector<int> b){}
void addTwoVectors(vector<int> a, vector<int> b, vector<int> &result){}:

但是,在其他一些情况下,我无法购买。例如,

bool checkInArray(int value, vector<int> arr){}

肯定会比

void checkInArray(int value, vector<int> arr, bool &inOrNot){}

在这种情况下,我认为直接返回结果的第一种方法在可读性方面更好。


综上所述,我很困惑(重点是C++):

  • 函数应该返回什么,不应该(或尽量避免)什么?
  • 有什么标准的方法或好的建议可以让我遵循吗?
  • 我们能否在可读性和代码效率方面做得更好?

编辑: 我知道,在某些情况下,我们必须使用其中之一。例如,我必须使用 return-type functions如果我需要实现 method chaining . 所以请关注两种方法都可以应用以实现目标的情况。

我知道这个问题可能没有单一的答案或肯定的事情。此外,似乎需要用许多编码语言做出这个决定,比如 C , C++等。因此,非常感谢任何意见或建议(最好有例子)。

最佳答案

一如既往,当有人提出一件事比另一件事更快的论点时,你有把握时间吗?在完全优化的代码中,在您计划使用的每种语言和每个编译器中?否则,任何基于性能的争论都是没有意义的。

稍后我会回到性能问题上,让我先解决我认为更重要的问题:当然,有充分的理由通过引用传递函数参数。我现在能想到的第一个是参数实际上是输入和输出,即函数应该对现有数据进行操作。对我来说,这就是采用非常量引用的函数签名所表示的。如果这样的函数随后忽略了该对象中已经存在的内容(或者更糟的是,显然只希望获得默认构造的函数),那么该接口(interface)就会令人困惑。

现在,回到性能上。我不能代表 C# 或 Java(虽然我相信在 Java 中返回一个对象首先不会导致复制,只是传递一个引用),而在 C 中,你没有引用但可能需要求助于传递指针周围(然后,我同意传递一个指向未初始化内存的指针是可以的)。但在 C++ 中,编译器长期以来一直在进行返回值优化,RVO,这基本上只是意味着在大多数调用中,如 A a = f(b);。 ,复制构造函数被绕过并且f将直接在正确的位置创建对象。在 C++11 中,我们甚至获得了移动语义来明确这一点并在更多地方使用它。

你应该只返回一个A*吗?反而?除非您真的怀念过去的手动内存管理。至少,返回一个 std::shared_ptr<A>std::unique_ptr<A> .

现在,有了多个输出,您当然会遇到更多的复杂问题。首先要做的是你的设计是否正确:每个函数都应该有一个单一的职责,通常,这也意味着返回一个单一的值。但是当然也有异常(exception);例如,分区函数必须返回两个或多个容器。在那种情况下,您可能会发现使用非 const 引用参数更容易阅读代码;或者,您可能会发现返回元组是可行的方法。

我强烈建议您以两种方式编写代码,并在第二天或周末后再回来查看这两个版本。然后,决定什么更容易阅读。最后,这是好的代码的主要标准。对于那些你可以看到与最终用户工作流程的性能差异的少数地方,这是一个需要考虑的额外因素,但只有在极少数情况下,它才应该优先于可读代码——并且只要付出更多的努力,你就可以无论如何通常都会让两者都起作用。

关于c++ - 返回与不返回函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20782063/

相关文章:

C 帮助 : Compiler gives me a "makes pointer from integer without cast" when using strlen()

php - wget 返回下载的文件名

c++ - 在 Visual Studio Proj 中使用 QT .qrc 文件...?

c++ - 将 C++ AlphaVSS DLL 从框架 2.0 转换为 4.0

c++ - 在引用限定符上重载成员函数的用例是什么?

python - 将曲线拟合到直方图并提取函数形式 - Python

C++函数输出

arrays - 返回嵌套数组的可靠性

java - 为什么我的方法返回错误的值?

C++ const引用参数优化