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