我不确定我是否应该内联这个:
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);
}
是否足够简单的函数可以并且应该被内联?
谢谢
我不确定我是否应该内联这个:
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);
}
是否足够简单的函数可以并且应该被内联?
谢谢
何时内联没有具体答案。Inline
只是对编译器的提示。所以它可能会忽略它,或者它可能会在没有提示的情况下内联。
在内联的情况下,性能可能会增加和减少。性能可能下降的原因之一是内联增加了代码的一面,它可能变得不那么缓存友好。你应该尝试你的代码,不管inline
它是否有效。
在找到瓶颈之前不要优化
由于现代编译器的优化,使用inline
不是那么明显和透明。有时编译器会自动将一个小函数内联,即使它没有这样声明。另一方面,有时即使您声明它是内联的,它也不会使函数内联。
您无法真正说出这一点,因为您无法说出什么成本更低:函数调用或复制代码(您可以,也许,但这并不容易一目了然)。另一方面,编译器可以很好地管理它。
另外,请记住 Donald Knuth 的一句名言:
过早的优化是编程中万恶(或至少是大部分)的根源。
我认为sqrt
and 条件将比额外的调用要多得多。无论如何,inline
只是一个提示。
如果您想将实现分离到源文件中,您是否指定都没有区别inline
。
如果将定义保留在标头中,则必须声明该函数inline
以防止多个定义。这并不是说该函数实际上会被内联。