返回结构vs传递引用变量

时间:2016-02-26 11:33:32

标签: c++ struct

如果我必须从函数返回字符串和数组,哪一个更好。

  1. 创建一个包含字符串和数组的结构,填充该结构并返回该结构的实例。
  2. 考虑一下我必须发送字符串" status"和数组" ids"。

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

    将其用作:

    ReturnValues returnValues;
    returnValues = func();
    

    考虑func()返回ReturnValues

    的对象
    1. 将其中一个作为引用变量传递并返回另一个。
    2. 如:

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

      考虑func将id作为引用变量

      string func(int& ids) {
        //Some code
        return status;
      }
      
      1. 将两者作为引用变量传递返回void。
      2. 如:

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

        考虑func将id和status作为引用变量

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

3 个答案:

答案 0 :(得分:1)

严格来说,从性能的角度来看,如果您这样做,它将为编译器提供最大的优化优势:

ReturnValues returnValues = func();

ReturnValues returnValues;
returnValues = func();

 V1 = {2,9,2,1,1,1,1,1,1,1,1,1,1,1,1} = 25;
 V1 = {2,9,1,2,1,1,1,1,1,1,1,1,1,1,1} = 25;
 V1 = {2,9,1,1,2,1,1,1,1,1,1,1,1,1,1} = 25;
  .........
 V1 = {2,1,1,1,1,1,1,8,1,1,1,1,1,1,3} = 25;    

会降低效果,因为无法进行返回值优化:http://goo.gl/5Cfmw2

答案 1 :(得分:0)

我肯定会选择第一个版本。修改其参数的函数往往会使代码更难以理解和测试。

如果您担心性能:实际上所有编译器都会在此处使用返回值优化。所以这不应该是一个问题,可能除了在一些奇特的情况下。

答案 2 :(得分:0)

就我个人而言,我可以将它们组合成预定义的struct或者使用std::pairtuple,如果您不想明确定义它们。我的感觉是,属于一起的东西属于一起(如果你原谅了重言式)。无论哪种方式,如果数组长度固定,我会考虑使用std::array,如果不是,我会考虑使用std::vector(或某些集合类型)。我不是{C}类型数组的粉丝,例如type A[10]我可能只是将它们作为返回值返回,因为它显示了意图"用它中的int和字符串给我一个这样的东西&#34 ;并让编译器对其进行排序