返回还是不返回,是函数的问题!或者,这真的重要吗?
故事是这样的: 我曾经写过如下代码:
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/