0

我不确定我是否应该内联这个:

float bm_softlight (float a, float b) {
    float Da = (a > 0.25f) ? sqrt (a) : ((16*a - 12) * a + 4) * a;
    return (b > 0.5f) ? Da*(2*b - 1) + 2*a*(1-b) : 2*a*b + a*a*(1-2*b);
}

是否足够简单的函数可以并且应该被内联?

谢谢

4

3 回答 3

4

何时内联没有具体答案。Inline只是对编译器的提示。所以它可能会忽略它,或者它可能会在没有提示的情况下内联。

在内联的情况下,性能可能会增加和减少。性能可能下降的原因之一是内联增加了代码的一面,它可能变得不那么缓存友好。你应该尝试你的代码,不管inline它是否有效。

在找到瓶颈之前不要优化

于 2012-07-18T13:36:34.320 回答
3

由于现代编译器的优化,使用inline不是那么明显和透明。有时编译器会自动将一个小函数内联,即使它没有这样声明。另一方面,有时即使您声明它是内联的,它也不会使函数内联。

您无法真正说出这一点,因为您无法说出什么成本更低:函数调用或复制代码(您可以,也许,但这并不容易一目了然)。另一方面,编译器可以很好地管理它。

另外,请记住 Donald Knuth 的一句名言:

过早的优化是编程中万恶(或至少是大部分)的根源。

于 2012-07-18T13:36:35.723 回答
1

我认为sqrtand 条件将比额外的调用要多得多。无论如何,inline只是一个提示。

如果您想将实现分离到源文件中,您是否指定都没有区别inline

如果将定义保留在标头中,则必须声明该函数inline以防止多个定义。这并不是说该函数实际上会被内联。

于 2012-07-18T13:53:59.510 回答