将参数作为数组传递是否更好(性能......)
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)
{
// …
}
答案 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
}