C++ 将参数作为数组传递?

C++ 将参数作为数组传递?,c++,parameters,parameter-passing,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]; // … } 模板 静态int-solveQuadraticFunction(数字*dst,常量数字*src) { 数字a=src[0],b=src[1],c=src[2]; /

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

template<typename Number>
static int solveQuadraticFunction(Number* dst, const Number* src)
{
  Number a=src[0], b=src[1], c=src[2];
  // …
}
模板
静态int-solveQuadraticFunction(数字*dst,常量数字*src)
{
数字a=src[0],b=src[1],c=src[2];
// …
}
还是“标准”方式

模板
静态整数平方函数(数字*dst,数字a,数字b,数字c)
{
// …
}

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

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

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


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

当调用第二个方法时,您将比第一个方法多推两个变量到堆栈中


但是,除非这是在一个非常紧密的循环中运行,否则它可能不会有什么不同。

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

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


(但是关于你的例子,一定要使用引用:
Number const&a=src[0]、&b=src[1]、&c=src[2]
。这些都会被任何半体面的编译器优化掉。)

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

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


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

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

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

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

template<typename Number, unsigned int SIZE>
static int solveQuadraticFunction(Number* dst, Number (&src)[SIZE])
{
  // … src is passed by reference
}
模板
静态int-solveQuadraticFunction(Number*dst、Number和src)[SIZE])
{
//…src通过引用传递
}

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

template<typename Number, unsigned int SIZE>
static int solveQuadraticFunction(Number* dst, Number (&src)[SIZE])
{
  // … src is passed by reference
}
模板
静态int-solveQuadraticFunction(Number*dst、Number和src)[SIZE])
{
//…src通过引用传递
}
可能不会

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

当然,如果参数在调用之前还没有排列在数组中,那么就没有增益(并且可能至少有轻微的损失)因为您必须找到某个地方将参数存储为数组—这可能涉及内存分配/释放—然后必须通过指针间接访问参数,这也会带来一些成本。

可能不会

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


当然,如果参数在调用之前还没有排列在数组中,那么就没有增益(并且可能至少有轻微的损失)因为您必须找到某个地方将参数存储为数组(这可能涉及内存分配/释放),然后必须通过指针间接访问参数,这也有一点成本。

我看不出将它们作为数组传递会有任何好处,除非它们已经在一个数组中。您需要删除堆栈变量氯