我需要执行一个将两个数字相乘并移位最终结果的子例程。
哪个是更合适的子例程:
void mul_inplace_both_pointers(q23* inout, q23* in)
{
*inout = (*inout * *in);
*inout = *inout << 8;
}
要么
void mul_inplace_one_pointer(q23* inout, q23 in)
{
*inout = (*inout * in);
*inout = *inout << 8;
}
要么
q23 mul_no_pointers(q23 in1, q23 in2)
{
q23 out;
out = in1 * in2;
out = out << 8;
return out;
}
该代码在DSP处理器上运行,因此应同时优化速度和大小。
q23 a;
q23 b;
mul_inplace_both_pointers( &a, &b);
mul_inplace_one_pointer ( &a, b);
a = mul_inplace_no_pointers ( a, b);
一分钟我可以忽略速度和大小的要求,而从程序员的角度来看,什么才是最合适的呢?
最佳答案
根据经验,我将尽可能减少传递给函数的指针的数量。仅在以下情况下可以通过指针:(1)需要更改参数(指向)的值,或(2)按值传递涉及开销,这在程序的工作方面非常重要(例如,非常大的开销)。数据结构)。
因此,如果您必须使用类似mul_inplace_XXX()
函数样式的函数,我可能会选择mul_inplace_one_pointer()
函数...
在您的特殊情况下-根据ae_q23
是什么,我根本不会使用任何函数。我只是做
inout *= in;
inout <<= 8;
在表面上的呼叫者代替。或者,经过测试;
inout = (inout * in) << 8;
显然,我假设所有操作都不会带来未定义的或其他(潜在的)意外行为。
在性能方面,尽管很少有绝对的保证。自然地进行测试和配置,以确保在目标平台上。出于多种原因,在没有进行测试/性能分析的情况下尝试进行优化称为“过早优化”-最值得注意的是,您精心制作的代码实际上可能无法通过预期的措施进行优化。
关于c - 就地乘法子例程-传递指针还是值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42269554/