为什么C++lambda是用函子而不是函数指针实现的

Why is C++ lambda implemented with functor instead of function pointer?

本文关键字:函数 指针 实现 C++lambda 为什么      更新时间:2023-10-16

我发现MSVC和GCC中的lambda都是实现operator()的函子。他们喜欢函子而不是函数指针的原因是什么?

问题是C++中的lambda函数可能有一个额外的状态(捕获的变量,也称为上下文),必须为每个实例传递(对于同一lambda函数的句柄的每个实例,它们可能不同)。

函数的状态不能与传递的句柄耦合。如果你想把这样的状态添加到函数指针中,你最终会编写一个包装器,它需要使用括号语法(operator())来调用,而括号语法恰好就是函子

一个值得注意的事实是,没有捕获的lambda可以转换为函数指针。这是可能的,因为不需要这样的额外空间。

函数没有状态,因此无法实现lambdas所需的功能。

此外,您可以保证lambdas具有唯一的类型,而单凭函数是无法做到这一点的。

除了前面提到的捕获能力之外,性能也是一个原因。通常,函数指针不能内联。函子可以是。这就是为什么std::sort比qsort快。如前所述,没有捕获的lambda可以转换为函数指针,但这主要是为了与旧的c api进行交互。也就是说,您可以将lambda传递给旧的win32api函数。通常,对于简单的lambda,编译器更喜欢内联它。