将参数作为数组传递?

时间:2011-04-26 12:01:53

标签: c++ parameters parameter-passing

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

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)
{
  // …
}

6 个答案:

答案 0 :(得分:3)

有关性能的所有问题最终都有相同的答案 - 实施解决方案并计算时间。话虽如此,我看不出阵列版本明显更快或更慢的任何原因,但肯定不太方便且可读性差。

答案 1 :(得分:2)

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

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

(但是关于你的例子,请务必使用引用:Number const &a=src[0], &b=src[1], &c=src[2]。这些将被任何半合适的编译器优化掉。)

答案 2 :(得分:2)

可能不是。

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

当然如果参数在调用之前尚未安排在数组中,那么就没有任何收益(并且可能至少有一点点损失),因为你必须找到一个地方来存储参数作为一个数组 - 可能涉及内存分配/释放 - 然后必须通过指针间接访问参数,这也有一点成本。

答案 3 :(得分:0)

当你调用第二种方法而不是第一种方法时,你会再将2个变量推入堆栈。

但它可能会产生很小的差异,除非它在一个非常紧凑的循环中运行。

答案 4 :(得分:0)

这取决于很多事情,当然取决于硬件/平台。通常,对于许多参数(> 4),阵列方法可能更有效。如果参数类型不适合CPU寄存器,则作为数组传递应始终更有效。

答案 5 :(得分:0)

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

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