在lambda和函子类之间进行选择是一种折衷。
通过最小化样板的数量并允许将与概念相关的代码以内联方式写入(即将或以后利用)函数中,lambda的收益主要是语法上的。
从性能角度来看,这并不比functor类差,functor类是包含单个“方法”的C ++结构或类。实际上,编译器对待lambda的方式与在后台编译器生成的仿函数类相同。
// define the functor method somewhere
struct some_computer_generated_gibberish_0123456789
{
int operator() (int x) const
{
if (x == 2) return 5;
if (x == 3) return 6;
return 0;
}
};
// make a call
some_computer_generated_gibberish_0123456789 an_instance_of_0123456789;
int outputValue = an_instance_of_0123456789(inputValue);
在您的代码示例中,就性能而言,它与函数调用没有什么不同,因为该函子类恰好没有状态(因为它具有空的capture子句),因此不需要分配,构造函数或销毁。
int some_computer_generated_gibberish_0123456789_method_more_gibberish(int x)
{
if (...) return ...;
return ...;
}
使用反汇编器调试任何不平凡的C ++代码始终是一项艰巨的任务。无论是否使用lambda都是如此。这是由于C ++编译器进行了复杂的代码优化而导致的,从而导致重新排序,交织和消除无效代码。
名称处理方面有些令人不快,调试器对lambda的支持仍处于起步阶段。只能希望调试器支持会随着时间的推移而改善。
当前,调试Lambda代码的最佳方法是使用支持在源代码级别设置断点的调试器,即通过指定源文件名和行号。