【问题标题】:Pass parameters as array?将参数作为数组传递?
【发布时间】:2011-08-12 23:55:57
【问题描述】:

将参数作为数组传递是否更好(性能……)

template<typename Number>
static int solveQuadraticFunction(Number* dst, const Number* src)
{
  Number a=src[0], b=src[1], c=src[2];
  // …
}

或“标准”方式

template<typename Number>
static int solveQuadraticFunction(Number* dst, Number a, Number b, Number c)
{
  // …
}

【问题讨论】:

  • 我认为你不会通过将它们作为数组传递来获得任何好处,除非它们已经在一个数组中。您声明的堆栈变量将使用相同的内存并调用您通过正常传递值获得的相同复制构造。阵列解决方案只会增加开销。

标签: c++ parameters parameter-passing


【解决方案1】:

这里所有关于性能的问题最终都有相同的答案 - 实施两种解决方案并为它们计时。话虽如此,我看不出数组版本会明显更快或更慢的任何原因,但它确实不太方便且可读性较差。

【讨论】:

    【解决方案2】:

    可能不会。

    这取决于调用前参数的排列。在前一种情况下,您需要在调用之前将参数排列到一个数组中,这可能已经是这种情况,也可能不是;如果已经是这种情况,并且有大量参数,那么它可能更优化,因为它不需要在堆栈上组装值。但是,这可能会导致值只是从数组复制到堆栈inside 调用的函数而不是outside,这取决于您随后如何访问参数(您给出的具体示例看起来有问题:您定义局部变量并从数组元素中分配它们;局部变量通常存在于堆栈中,尽管编译器可能能够将它们优化掉)。

    当然,如果在调用之前参数尚未排列在数组中,则没有任何好处(并且可能至少会受到轻微的惩罚),因为您必须找到将参数存储为数组的地方 - 这可能涉及内存分配/释放 - 然后必须通过指针间接访问参数,这也有一点成本。

    【讨论】:

      【解决方案3】:

      我怀疑您会看到性能上的任何差异;给定适当的优化设置和内联,编译器应该能够决定使用哪一个。

      当参数数量较少时,应该首选第二个选项,因为它允许编译器检查传入的项目数。

      (但关于您的示例,请务必使用引用:Number const &amp;a=src[0], &amp;b=src[1], &amp;c=src[2]。这些将被任何半体面的编译器优化掉。)

      【讨论】:

        【解决方案4】:

        当您调用第二种方法时,您将比第一种方法多推 2 个变量到堆栈上。

        但除非这是在一个非常紧密的循环中运行,否则它可能几乎没有什么区别。

        【讨论】:

          【解决方案5】:

          这取决于很多事情,当然也取决于硬件/平台。一般来说,对于许多参数(> 4),数组方法可能更有效。如果参数类型不适合 CPU 寄存器,则作为数组传递应该总是更有效。

          【讨论】:

            【解决方案6】:

            当然最好传递第一个元素的地址而不是推送所有元素。您可以通过引用传递指针或数组,如下所示:

            template<typename Number, unsigned int SIZE>
            static int solveQuadraticFunction(Number* dst, Number (&src)[SIZE])
            {
              // … src is passed by reference
            }
            

            【讨论】:

              猜你喜欢
              • 2016-09-26
              • 1970-01-01
              • 2021-06-03
              • 2014-03-09
              • 2010-12-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多