her*_*tao 5 c++ performance return function code-readability
返回还是不返回,是函数的问题!或者,这真的很重要吗?
故事是这样的:我曾经写过如下代码:
Type3 myFunc(Type1 input1, Type2 input2){}
Run Code Online (Sandbox Code Playgroud)
但是最近我的项目学院告诉我,我应该尽量避免编写这样的函数,并建议通过将返回值放在输入参数中的方式进行以下操作。
void myFunc(Type1 input1, Type2 input2, Type3 &output){}
Run Code Online (Sandbox Code Playgroud)
他们让我相信这是更好更快的,因为在第一种方法中返回时有额外的复制步骤。
对我来说,我开始相信在某些情况下第二种方法更好,尤其是我有很多东西要返回或修改。例如:后面的第二行会比第一行更好更快,因为避免vecor<int>在返回时复制整个。
vector<int> addTwoVectors(vector<int> a, vector<int> b){}
void addTwoVectors(vector<int> a, vector<int> b, vector<int> &result){}:
Run Code Online (Sandbox Code Playgroud)
但是,在其他一些情况下,我无法购买。例如,
bool checkInArray(int value, vector<int> arr){}
Run Code Online (Sandbox Code Playgroud)
肯定会比
void checkInArray(int value, vector<int> arr, bool &inOrNot){}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我认为直接返回结果的第一种方法在更好的可读性方面更好。
总之,我对(强调 C++)感到困惑:
编辑:我知道,在某些情况下,我们必须使用其中之一。例如,return-type functions如果我需要实现method chaining. 因此,请关注两种方法都可以实现目标的情况。
我知道这个问题可能没有单一的答案或确定的事情。此外,它似乎这个决定需要在许多编码语言来进行,比如C,C++等于是任何意见或建议,非常感谢(更好的例子)。
像往常一样,当有人提出一件事比另一件事快的论点时,你有没有把握时机?在完全优化的代码中,在您计划使用的每种语言和每种编译器中?没有这一点,任何基于性能的论点都是没有实际意义的。
稍后我将回到性能问题,让我先解决我认为更重要的问题:当然,通过引用传递函数参数是有充分理由的。我现在能想到的主要是参数实际上是输入和输出,即函数应该对现有数据进行操作。对我来说,这就是采用非常量引用的函数签名所表明的。如果这样的函数然后忽略该对象中已有的内容(或者更糟糕的是,显然希望只获得默认构造的对象),则该接口令人困惑。
现在,回到性能。我不能说 C# 或 Java(虽然我相信在 Java 中返回一个对象首先不会导致复制,只是传递一个引用),并且在 C 中,你没有引用,但可能需要求助于传递指针周围(然后,我同意传递一个指向未初始化内存的指针是可以的)。但是在 C++ 中,编译器已经做了很长时间的返回值优化,RVO,这基本上只是意味着在大多数调用中A a = f(b);,复制构造函数被绕过,f将直接在正确的位置创建对象。在 C++11 中,我们甚至获得了移动语义来明确这一点并在更多地方使用它。
你应该只返回一个A*吗?只有当您真的很喜欢手动内存管理的过去时。至少,返回 anstd::shared_ptr<A>或 an std::unique_ptr<A>。
现在,有了多个输出,您当然会遇到额外的复杂情况。首先要做的是你的设计是否真的正确:每个函数都应该有一个单一的责任,通常,这也意味着返回一个单一的值。但当然也有例外。例如,分区函数必须返回两个或多个容器。在这种情况下,您可能会发现使用非常量引用参数更容易阅读代码;或者,您可能会发现返回元组是一种可行的方法。
我敦促您以两种方式编写代码,并在第二天或周末后再回来查看这两个版本。然后,决定什么更容易阅读。最后,这是良好代码的主要标准。对于那些您可以看到与最终用户工作流程性能差异的少数地方,这是一个需要考虑的额外因素,但只有在极少数情况下,它才应该优先于可读代码 - 只需多做一点努力,您就可以通常无论如何都要让两者都工作。
| 归档时间: |
|
| 查看次数: |
2230 次 |
| 最近记录: |