【问题标题】:Returning vs. using a reference parameter [duplicate]返回与使用参考参数[重复]
【发布时间】:2012-08-23 01:11:05
【问题描述】:

这真的让我很烦,来自 C# 背景。

有时,我看到这样写的函数:

int computeResult();

这是我习惯的。但后来我看到它们是这样写的:

void computeResult(int &result);

我觉得这很奇怪。如果有的话,第二种方法比第一种方法有什么好处?一定有什么,因为我经常看到。

【问题讨论】:

  • 这更像是一个实用主义的问题。有时,当结果需要在一个对象中时,它需要一个深拷贝到堆栈上或在堆上分配一个结果对象,之后必须小心释放。使用引用参数可以避免两者。
  • 我看不出void computeResult(int &result);的原因,除非它像bool computeResult(int &result);

标签: c++ return-value ref


【解决方案1】:

此类非常量引用参数有两个常见原因:

  • 您可能需要在一个函数中使用多个“out”参数,而使用引用参数可以做到这一点。

  • 您的对象复制起来可能很昂贵,因此您传入一个将被变异的引用,而不是返回一个可能在返回过程中被复制的对象。昂贵的复制对象可能包括标准容器(如vector)和管理堆内存的对象,其中会发生分配-复制-解除分配序列。请注意,编译器在尽可能优化这些副本方面做得非常好,因此这个原因的导入量比以前少了。

编辑:我应该澄清,即使在 C++ 中,您提供的带有单个内置类型引用参数的特定示例也非常不典型。在这种情况下,返回值几乎总是首选。

【讨论】:

  • 是的,我明白为什么用 int 来做有点过火了,但如果我使用字符串或其他东西会有意义吗?
  • @Boreal 由于复杂性增加,即使是字符串,我也几乎从不使用这种模式。我让优化器做它的事情,让分析器指导我的性能变化。
  • 哪种对象可以保证第二种模式?
  • @Boreal 我编辑了几个复制成本高的对象示例。
  • 请注意,按值返回的开销可能非常很小,因为在大多数情况下,副本可以被删除或替换为移动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 2021-04-27
  • 1970-01-01
相关资源
最近更新 更多