【问题标题】:C++ parameter passing array vs individual itemsC ++参数传递数组与单个项目
【发布时间】:2013-02-26 03:24:36
【问题描述】:

考虑两个函数:

int foo(int, int);

int bar(int*);

(假设 bar 在一个大小为 n 的数组中传递,其中 n = # of foo 参数,各自的值是等价的,并且函数在功能上是相同的)

前一种方法比后一种方法“更好”吗?

【问题讨论】:

  • 你有数组吗?然后将其作为数组传递。你有不同的价值观吗?将其作为单独的值传递。
  • 如果你想避免创建一个数组只是为了将两个参数传递给一个函数,那么是的,前者更可取。

标签: c++ function parameters pass-by-reference pass-by-value


【解决方案1】:

这取决于你所说的“更好”是什么意思:如果传递多个参数更符合程序的逻辑结构,那么传递多个参数的可读性肯定要好得多。是否可能是这种情况的一个很好的测试是询问数组的各个元素是否会从单独命名中受益。如果答案是“是”,那么单个参数会更好。在传递参数时到处保存几个字节并不能弥补可读性的轻微损失。

【讨论】:

    【解决方案2】:

    是的,前一种方法int foo(int, int);可以在编译时检查参数。 int bar(int*) 需要对传入的数组进行假设。

    【讨论】:

      【解决方案3】:

      我能想到int bar(int*) 的一个缺点是它会使重载变得更加困难。例如:

      int areaOfRectangle(int width, int height);
      int areaOfRectangle(int x1, int y1, int x2, int y2);
      

      很好,但是你打算如何使用数组呢?

      int areaOfRectangle(int* widthHeight);
      int areaOfRectangle(int* coordinates); // error
      

      上面的代码无法编译,因为int areaOfRectangle(int*) 不能被声明/定义两次。

      此外,如果您只是将数组用作任意分组参数的一种方式,您的代码就会更难阅读和使用。比较:

      int calculateIncome(int normalHours, 
                          int overtimeHours, 
                          int normalRate
                          int overtimeRate); // Self documenting
      
      int calculateIncome(int* parameters); // How do I use this function?
      
      int calculateMean(int* numbers); // Parameters are logically grouped, 
                                       // so array makes sense
      

      第三个问题(桑乔在他的回答中描述)是int bar(int*) 很危险。当用户调用你的函数一个比你期望的更小的数组时会发生什么?另一方面,使用错误数量的参数调用 int Foo(int, int) 将无法编译。

      【讨论】:

        【解决方案4】:

        这取决于“更好”是什么:

        1. 为了获得更好的性能:

          1 如果数组只有几个元素(比如少于 6 个参数,取决于目标 CPU,可用的寄存器可以用来传递参数), foo() 方法更好,因为所有变量都可以传递通过登记;而 foo 可以直接从寄存器中取出值。而对于 bar,需要取消引用指针。

          2 如果数组有超过 10 个项目。最好使用指针传递,因为这样将参数压入堆栈顶部的堆栈操作较少。

        2. 为了减少错误: foo() 方法更好,因为对于 bar() 方法,可以通过 bar 中的语句修改项目,从 bar() 返回后可以看到,如果不维护项目的操作,这可能会导致错误在 bar() 中仔细。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-28
          • 2023-03-26
          相关资源
          最近更新 更多