返回与不返回函数?

英雄胡桃

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


故事来了:我以前编写如下代码:

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因此,请专注于可以同时使用两种方法实现目标的情况。

我知道这个问题可能没有一个答案或肯定的答案。此外,它似乎这个决定需要在许多编码语言来进行,比如CC++等于是任何意见或建议,非常感谢(更好的例子)。

克里斯托弗·克罗伊齐格

一如往常,当有人提出一件事比另一件事快的论点时,您是否把握住时机?在完全优化的代码中,您计划使用的每种语言和每种编译器?没有这一点,任何基于性能的争论都是没有根据的。

我将在第二秒钟再回到性能问题,让我先谈谈我认为更重要的一点:当然,有充分的理由通过引用传递函数参数。我现在可以想到的主要参数是参数实际上是输入和输出,即该功能应该在现有数据上运行。对我而言,这就是采用非const引用的函数签名所指示的含义。如果这样的函数然后忽略了该对象中已经存在的内容(或更糟糕的是,显然希望仅获得默认构造的对象),则该接口会造成混乱。

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

您是否应该只返回一个A*仅当您真的很渴望手动内存管理的过去时。至少返回astd::shared_ptr<A>或an std::unique_ptr<A>

现在,有了多个输出,您当然会遇到其他麻烦。首先要做的是,如果您的设计实际上是正确的:每个函数应负有单一责任,通常,这意味着也应返回单个值。但是当然有例外。例如,分区函数将必须返回两个或更多容器。在这种情况下,您可能会发现使用非常量引用参数更容易阅读代码;或者,您可能会发现返回元组是路要走。

我敦促您以两种方式编写代码,然后第二天或周末返回,再次查看两个版本。然后,决定更容易阅读的内容。最后,这是好的代码的主要标准。对于少数几个您可以看到最终用户工作流程的性能差异的地方,这是要考虑的另一个因素,但是只有在极少数情况下,它才比可读代码具有优先权-稍加努力,您就可以无论如何通常都会让两者都上班。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章