你好。我找了一個答案,但沒有找到這個具體問題。 Here我找到了一個article,它顯示了Visual C++編譯器在各種情況下如何消除多餘的Copy構造函數和析構函數調用。我相信Clang和GCC也是如此。C++。返回一個對象或傳遞一個引用來填充?
有兩個結構:輸入數據Waveform
和結果Analyzed
。兩個函數做同樣的工作,但以不同的方式返回結果。 1st創建一個本地Analyzed
並返回它(副本),2nd引用已經創建的對象來填充它,返回相同的值。
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如何重用形式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);
這與C標籤無關。 –
@SouravGhosh我已經添加了C標籤,因爲「...在C一個好的習慣考慮通過...」 – kyb
這沒關係,但恕我直言,標籤不屬於這裏。\ –