C .返回对象或传递引用以填写

C++. Return an object or pass a reference to be filled?

本文关键字:引用 返回 对象      更新时间:2023-10-16

你好。我寻找答案,但没有找到这个特定问题。在这里,我找到了一篇文章,该文章显示了视觉C 编译器如何在各种情况下消除冗余复制构造函数和破坏性调用。我相信clang和GCC也是如此。

有两个结构:输入数据Waveform和结果Analyzed。两个功能执行相同的工作,但以不同的方式返回结果。第1个创建本地Analyzed并将其返回(副本(,第二个引用已经创建的对象填充它,返回相同的对象。

struct Waveform;
struct Analyzed;
Analyzed  analyze( Waveform const& wf );  // Form 1
Analyzed& analyze( Waveform const& wf, Analyzed& an );  // Form 2

示例用法,假设Waveform wf已经在范围中:

auto an0 = analyze(wf);
Analyzed const& an1 = analyze(wf);
Analyzed an3;
analyze(wf,an3);

至于我表格1 更短,更方便。

据我所知,在C中,一个很好的做法考虑将函数指针传递给预先存储器(因此用户负责内存(,而不是返回对象大于sizeof(int),而是返回指针或错误号码。

问题。 analyze()形式更好吗?为什么?
是否有任何性能问题,额外的副本,陷阱?
有特殊情况吗?


我也可以想象表格1 reuses 表格2

Analyzed  analyze( Waveform const& wf ){
  Analyzed an;
  analyze(wf,an);
  return an;
}

<扰流板>更长的描述。有两个结构:Waveform代表一个信号,Analyzed-信号的特征。

struct Waveform {
  size_t len;
  float *arr;
  float sampleRate;
  //...
}
struct Analyzed {
  struct Entry { size_t idx; float value; };
  Entry max;
  Entry min;
  float peakToPeak;
  float mean;
  //...
};
Analyzed  analyze( Waveform const& wf );
Analyzed& analyze( Waveform const& wf, Analyzed& an );

现在,许多人首选此表格:

auto a = analyze(wf);

写作很简单,简单地理解;什么都不会出错。C 17草案规范包括保证不会涉及中间临时对象;C 14使该可选。大多数编译器确实采用了该选项。

如果将其与以下内容进行比较:

Analyzed an;
analyze(wf, an);

两个主要区别是:

  • 从读取代码中,函数参数是否为"," out"或" in-in-in-in-in-out"参数,尚不清楚。您必须查找文档。
  • 如果Analyzed没有默认构造人,这甚至根本不起作用。这并不少见;将构造函数设置为构建对象,以遵循良好的面向对象的原理;而不是让构造函数制作一个虚拟外壳,以稍后将"初始化"。

这两者都使代码不太容易理解,并且更有可能与它们相关的编码错误。