C++ C++;。返回对象或传递要填充的引用?

C++ C++;。返回对象或传递要填充的引用?,c++,reference,return,return-value,C++,Reference,Return,Return Value,你好。我寻找答案,但没有找到这个具体问题的答案。 我找到了一个显示Visual C++编译器如何在各种情况下消除冗余复制构造函数和析构函数调用的方法。我相信对于Clang和GCC也是如此 有两种结构:输入数据波形和结果分析。两个函数做相同的工作,但返回结果的方式不同。第一个创建一个本地analysisted并返回它(副本),第二个引用一个已经创建的对象来填充它,并返回相同的值 struct Waveform; struct Analyzed; Analyzed analyze( Wavefo

你好。我寻找答案,但没有找到这个具体问题的答案。 我找到了一个显示Visual C++编译器如何在各种情况下消除冗余复制构造函数和析构函数调用的方法。我相信对于Clang和GCC也是如此

有两种结构:输入数据
波形
和结果
分析
。两个函数做相同的工作,但返回结果的方式不同。第一个创建一个本地
analysisted
并返回它(副本),第二个引用一个已经创建的对象来填充它,并返回相同的值

struct Waveform;
struct Analyzed;

Analyzed  analyze( Waveform const& wf );  // Form 1
Analyzed& analyze( Waveform const& wf, Analyzed& an );  // Form 2
示例用法,假设
波形wf
已在范围内:

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

Analyzed an3;
analyze(wf,an3);
对我来说,表格一更短更方便

据我所知,在
C
中,一个好的做法是将函数指针传递到预先分配的内存(因此用户负责内存),并且不返回大于
sizeof(int)
的对象,而是返回指针或错误号

这个问题。
analyze()
表单之一更好吗?为什么?
是否存在任何性能问题、额外拷贝、陷阱?
有特殊情况吗


我还可以想象表格1如何重用表格2:


更长的描述。 有两种结构:
波形
表示信号,
分析
-信号的特征

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);
其中两个主要区别是:

  • 仅仅通过阅读代码不清楚函数参数是“in”、“out”还是“in-out”参数。你得查一下文件
  • 如果
    analysisd
    没有默认构造函数,这甚至根本不起作用。这并不罕见;让构造函数设置一个对象是遵循良好的面向对象原则的;而不是让构造函数生成一个稍后将被“初始化”的虚拟shell

这两种情况都会降低代码的易懂性,并且更容易出现与之相关的编码错误。

这与C标记无关。@SouravGhosh我添加了C标记,因为“…在C中,一个良好的做法是考虑传递…”这没关系,但我知道标记不属于这里。\n有很多语言,每个都有自己的最佳实践。没有理由单挑C。
Analyzed an;
analyze(wf, an);