2017-05-04 18 views
1

你好。我找了一個答案,但沒有找到這個具體問題。 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); 
+0

這與C標籤無關。 –

+0

@SouravGhosh我已經添加了C標籤,因爲「...在C一個好的習慣考慮通過...」 – kyb

+0

這沒關係,但恕我直言,標籤不屬於這裏。\ –

回答

1

這種形式是現在很多人首選:

auto a = analyze(wf); 

很簡單編寫和簡單易懂;沒有什麼可以出錯。 C++ 17草案規範包括保證不會涉及中間臨時對象; C++ 14使這是可選的。大多數編譯器確實採取了這種選擇。

如果你比較這有:

Analyzed an; 
analyze(wf, an); 

兩個主要區別是:

  • 目前尚不清楚,只是從閱讀代碼的函數參數是否爲「中」,「出「或」輸入「參數。你必須查閱文檔。
  • 如果Analyzed沒有默認構造函數,那麼這根本不會工作。這並不罕見;它遵循良好的面向對象的原則,讓構造函數設置對象;而不是讓構造函數創建一個虛擬外殼,稍後將進行「初始化」。

這兩者都會使代碼變得不易理解,並且更容易出現與其相關的編碼錯誤。

相關問題