【发布时间】:2019-02-08 18:10:47
【问题描述】:
我的问题是对此进行扩展:Why can lambdas be better optimized by the compiler than plain functions?
重申一下,结论是 lambda 创建了编译器可以轻松内联的不同特化,而函数指针并不容易内联,因为一组函数原型只有一个特化。考虑到这一点,函数指针模板是否会像/更快的 lambdas 一样快?
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
template <class F>
int operate(int a, int b, F func)
{
return func(a, b);
}
template <int func(int, int)>
int operateFuncTemplate(int a, int b)
{
return func(a, b);
}
int main()
{
// hard to inline (can't determine statically if operate's f is add or sub since its just a function pointer)
auto addWithFuncP = operate(1, 2, add);
auto subWithFuncP = operate(1, 2, sub);
// easy to inline (lambdas are unique so 2 specializations made, each easy to inline)
auto addWithLamda = operate(1, 2, [](int a, int b) { return a + b; });
auto subWithLamda = operate(1, 2, [](int a, int b) { return a - b; });
// also easy to inline? specialization means there are 2 made, instead of just 1 function definition with indirection?
auto addWithFuncT = operateFuncTemplate<add>(1, 2);
auto subWithFuncT = operateFuncTemplate<sub>(1, 2);
}
因此,如果我可以按性能等级对这些进行排名,那么:
operatorFuncTemplate >= operate<LAMBDA> >= operate<FUNCTIONPTR>
是否存在这种关系在非平凡示例中可能失败的情况?
【问题讨论】:
-
可以使用godbolt分析生成的代码
-
@OneManMonkeySquad 我查看了 MSVC++ 中的反汇编,但所有内容都在发布时预编译,而且我还不够熟练,无法准确理解在调试模式下内联发生的位置。此外,我不知道这个问题如何随着实际函数和 lambdas 扩大。
-
你当然是对的 :)
标签: c++ performance templates lambda inline