Мой вопрос заключается в следующем: Почему лямбды могут быть лучше оптимизированы компилятором, чем обычные функции?
Повторюсь, вывод состоит в том, что лямбды создают разные специализации, которые компиляторы могуттривиально встроенный, тогда как указатели на функции не так просто встроить, так как для набора прототипов функций существует одна специализация.Учитывая это, будут ли шаблоны указателей работать так же быстро, как и быстрее лямбды?
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>
Существуют ли случаи, когда это отношение может не срабатывать в нетривиальных примерах?