2016-02-26 113 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获得这些东西之一”的意图,并让编译器对它进行排序