C .返回对象或传递引用以填写
C++. Return an object or pass a reference to be filled?
你好。我寻找答案,但没有找到这个特定问题。在这里,我找到了一篇文章,该文章显示了视觉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
没有默认构造人,这甚至根本不起作用。这并不少见;将构造函数设置为构建对象,以遵循良好的面向对象的原理;而不是让构造函数制作一个虚拟外壳,以稍后将"初始化"。
这两者都使代码不太容易理解,并且更有可能与它们相关的编码错误。
相关文章:
- 如何通过引用返回对象
- 函数如何使用引用返回所需的数字?
- 如何防止引用返回的私有结构的突变
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 通过引用返回的变量的范围
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 运算符重载C++类中的引用返回
- C++对象引用返回不同的值
- 解释通过从函数引用返回数组的语法
- 具有引用返回类型的重写方法上的协变返回类型无效
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 为什么我在函数中使用引用并通过引用返回它仍然有效?
- 直接在 C++ 中将值分配给引用返回类型
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 可以通过常量引用返回默认参数的值吗?
- 按值与右值引用返回
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 当我使用按引用返回时,我不知道这些代码之间的区别
- 为什么通过引用返回向量比通过移动返回要快得多?
- 通过引用返回包含对象的向量