我需要执行一个将两个数字相乘并移位最终结果的子例程。

哪个是更合适的子例程:

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/

10-11 12:20