2016-02-26 130 views
-1

如果必須從函數返回字符串和數組,則哪一個更好?返回結構vs pass參考變量

  1. 創建一個包含字符串和數組的結構,填充該結構並返回該結構的實例。

考慮我必須發送字符串「狀態」和數組「ids」。

struct ReturnValues { 
     string status; 
     int ids[10]; 
    }; 

使用它作爲:

ReturnValues returnValues; 
returnValues = func(); 

考慮到FUNC()返回ReturnValues的對象

  • 通它們中的一個作爲參考的變量和返回另一個。
  • 如:

    int ids[10]; 
    string status = func(ids); 
    

    考慮到FUNC需要ID作爲引用的變量

    string func(int& ids) { 
        //Some code 
        return status; 
    } 
    
  • 通行證既作爲引用的變量返回void。
  • 由於:

    int ids[10]; 
    string status; 
    func(ids, status); 
    

    考慮到FUNC需要IDS和狀態引用變量

    void func(int& ids, string& status) { 
        //some code; 
    } 
    
    +0

    這取決於你的編譯器優化設置。 –

    回答

    1
    從性能的角度

    嚴格,它會給編譯器中最大的槓桿作用,如果你優化做:

    struct ReturnValues { 
        string status; 
        int ids[10]; 
    }; 
    

    and

    ReturnValues returnValues = func(); 
    

    ReturnValues returnValues; 
    returnValues = func(); 
    

    會降低性能,因爲返回值的優化不能發生:http://goo.gl/5Cfmw2

    +0

    正確,第二個版本也應該避免出於其他原因:你不能使returnValues爲const,有人可能試圖訪問未初始化的變量,最後它更詳細。 –

    0

    我肯定會去的第一個版本。修改參數的函數往往會使代碼更難以理解和測試。

    如果您擔心性能:實際上所有的編譯器都會在這裏使用返回值優化。所以這不應該是一個問題,也許除了在一些異國情況下。

    0

    就我個人而言,我會將它們組合在一起,或者像您一樣將它們組合到預定義的struct中,或者如果您不想明確定義一個,則使用std::pairtuple。我的感覺是屬於一起的東西屬於一起(如果你會原諒重言式)。無論哪種方式,如果數組長度固定,我會考慮使用std::array,如果不是,則考慮使用std::vector(或某種集合類型)。我不是C級類型數組的粉絲,比如type A[10]我可能只是將它們作爲返回值返回,僅僅是因爲它顯示了「使用ints和strings獲得這些東西之一」的意圖,並讓編譯器對它進行排序