函数返回与不返回?

2024-03-29

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


故事就这样开始了: 我曾经编写如下代码:

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++):

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

Edit: 我知道,在某些情况下,我们必须使用其中之一。例如,我必须使用return-type functions如果我需要实现method chaining. 因此,请重点关注可以同时应用这两种方法来实现目标的情况。

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


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

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

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

你应该返回一个A*反而?除非您真的渴望过去手动内存管理的日子。至少,返回一个std::shared_ptr<A> or an std::unique_ptr<A>.

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数返回与不返回? 的相关文章

随机推荐

  • Windows 上的 Python 包:pip 还是本机安装程序?

    与使用打包安装程序 exe msi 相比 使用 pip 在 Windows 上安装 python 软件包的相对优点是什么 对于初学者来说 有些对我来说不起作用 MySQLdb 是 我的新规则 Try pip or easy install
  • NodeJS + Mysql 与 Docker Compose 2

    我正在尝试构建一个 docker compose 文件来在本地部署连接到 mysql 服务器的 NodeJS 应用程序 我已经尝试了所有方法 在 Stackoverflow 中阅读了大量教程和一些问题 但我不断收到 ECONNREFUSED
  • Apache .htaccess:如何在 Firefox 上用斜杠重写反斜杠?

    如何重写反斜杠 带斜线 在火狐浏览器上 Chrome IE Safari Opera 已构建浏览器用斜杠重写反斜杠 但 Firefox 3 6 13 回归404错误页面 Why Firefox returns 404 error page
  • 使用history.pushState()更新URL中的参数

    我在用history pushState在我的页面上进行 AJAX 调用后 将一些参数附加到当前页面 URL 现在 在基于用户操作的同一页面上 我想使用相同或附加的参数集再次更新页面 URL 所以我的代码如下所示 var pageUrl w
  • 如何使用有状态 LSTM 和 batch_size > 1 布置训练数据

    背景 我想在 Keras 中对 有状态 LSTM 进行小批量训练 我的输入训练数据位于一个大矩阵 X 中 其维度为 m x n 其中 m number of subsequences n number of time steps per s
  • Bokeh - 如何使 HoverTool 工具提示粘在点击点上?

    下面的代码来自于Jupyter笔记本 https nbviewer jupyter org github draperjames PythonRef blob master Bokeh 20HoverTool 20Custom 20Tool
  • 在 Ubuntu 12.04 上为 Perl 5.14.2 LWP 安装新的 ca 证书

    我在尝试使用 LWP 连接到特定 https 网站时收到以下错误 LWP Protocol https Socket SSL connect attempt failed with unknown errorerror 14090086 S
  • 用于计算“该月最后一个星期四”等间隔的工具/库

    我正在寻找一个命令行工具或某种Python库 然后我可以包装 这样我就可以计算指定的日期 例如 该月的最后一个星期四 也就是说 我想让人们输入像上面这样的人类友好文本 并且它应该能够计算任何月 年 任何满足该要求的日期 有什么建议么 mxD
  • Java SSLEngine 示例 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我找到了一个如何实现 Java SSLEngine 的示例here http docs oracle
  • Github认为合并后分支不同

    我已经被这个 Github 问题撞到墙上了 终于来到这里寻求帮助 我的repo https github com KAPSARC KTAB有两个感兴趣的分支 master 这是当前实时发布的分支 并且alternate testing 这正
  • Magento 获取 phtml 文件上使用的布局

    有没有办法可以获取某个 phtml 文件使用的布局 就我而言 我想检查catalog list phtml 上使用的布局 我使用该信息对产品图像网格大小进行条件 if 我试着用谷歌搜索一下 但所有的结果只是解释有关 xml 布局的事情 我得
  • Grails 从域验证器获取会话变量

    我确信这是一个常见的情况 但我还没有找到任何答案 我有一个会话范围的变量 用于保存当前登录的用户 我需要通过域对象中的自定义验证器来执行条件验证 有没有办法在验证器中从会话范围中获取当前用户 或者是否有其他方法可以做到这一点 请记住我希望能
  • 子类如何调用与子类的方法名相同的超类的方法?

    include
  • 尝试为每个 Web 请求实现会话,没有当前会话上下文配置

    正如我在标题中所说 我想为每个网络请求实现会话 我的会话提供程序是这样配置的 我对更改此配置不感兴趣 public class SessionProvider public static SessionProvider Instance g
  • 向 Google Cloud Firestore 上传和下载文件

    我看到 Firebase 已经发布了一个新的测试版 名为 Cloud Firestore 在文档中 文档的所有操作都描述得非常好 但我无法找到有关使用 Android 将媒体文件上传和下载到 Cloud Firestore 的任何信息 有人
  • 重写 php 应用程序以获得 seo 友好的 url

    我有 php 应用程序 由于客户要求拥有 SEO 友好的 url 因此必须部分重写 我的链接如下 www mysite com articles en php artid 89 我必须更改其中的网址 www mysite com artic
  • 使用Subject 和Observable 之间有什么区别,各自的用途是什么?

    我了解了制作 Observable 的两种不同方法 第一个是一个主题 如下所示 file A const message new Subject file B message subscribe message gt console log
  • 保留解密加密数据库的解密密钥的最佳方法是什么?

    我有一个加密的数据库和解密密钥 如何使解密密钥免受黑客攻击 数据库黑客攻击和未经授权的 PC 访问 汇编中的硬编码 保存在注册表中 保存在内存中 此外 我需要加密数据的算法 在每个解密时间期限的安全性方面 执行此操作的最佳算法是什么 RSA
  • GNU 日期和自定义格式

    我有一些特定日期格式的字符串 我想使用 GNU date 命令 coreutils 8 20 来处理它们 我可以使用 FORMAT 字符串获取要输出的日期 但不能理解使用相同字符串输入的字符串 我很确定我错过了一些明显的东西 是什么赋予了
  • 函数返回与不返回?

    返回还是不返回 是函数的问题 或者说 这真的很重要吗 故事就这样开始了 我曾经编写如下代码 Type3 myFunc Type1 input1 Type2 input2 但最近我的项目学院告诉我 我应该尽可能避免编写这样的函数 并建议采用以