こんにちは。私は答えを探しましたが、この特定の質問では見つかりませんでした。 Herearticleは、Visual C++コンパイラがさまざまな状況で冗長なコピーコンストラクタとデストラクタコールをどのように削除するかを示しています。私はClangとGCCについても同じことが当てはまると信じています。C++。オブジェクトを返すか、参照を渡して塗りつぶすか?
入力データWaveform
と結果Analyzed
の2つの構造体があります。そして、2つの関数は同じ作業を行いますが、異なる方法で結果を返します。 1stはローカルAnalyzed
を作成し、それを返します(コピー).2番目は既に作成されたオブジェクトを参照してそれを埋め込み、それを返します。
struct Waveform;
struct Analyzed;
Analyzed analyze(Waveform const& wf); // Form 1
Analyzed& analyze(Waveform const& wf, Analyzed& an); // Form 2
スコープにすでにWaveform wf
を想定した使用例、:フォーム1が短く、より便利である私として
auto an0 = analyze(wf);
Analyzed const& an1 = analyze(wf);
Analyzed an3;
analyze(wf,an3);
。
私が知る限り、C
では、事前に割り当てられたメモリへの関数ポインタ(ユーザーはメモリの責任を負う)に渡し、sizeof(int)
より大きいオブジェクトを返しませんが、ポインタまたはエラー番号を返しません。
質問です。analyze()
フォームのほうが良いですか?どうして?
パフォーマンス上の問題、余分なコピー、落とし穴はありますか?
特別なケースがありますか?
私もフォーム1がフォーム2を再利用する方法を想像することができます:
Analyzed analyze(Waveform const& wf){
Analyzed an;
analyze(wf,an);
return an;
}
<スポイラー> 長い説明を。 2つの構造体があります: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);
これはCタグとは関係ありません。 –
@SouravGhosh Cタグを追加しました。「... Cは良い習慣であると考えています...」 – kyb
これは問題ありませんが、ここにはタグはありません。\ –