C++ 中的 lamda 表达式是 C++11 标准引入的特性,用于创建匿名函数。它的实现原理涉及到编译器的词法分析、语法分析以及闭包的概念。
使用方法:
1
2
3
4
5
6
7
8
9
10
11
// 显示设置返回值
[capture](parameters) -> return_type
{
// lamda body
}
// 编译器自动推理返回值
[capture](parameters)
{
// lamda body
}
其中:
- capture:捕获列表,用于捕获外部变量
- parameters:函数参数列表
- return_type:返回类型
- lamda body:函数体
Lambda表达式的实现原理大致可以分为以下几个步骤:
- 词法分析和语法分析:编译器首先对lambda表达式进行词法分析和语法分析,将其分解为各个组成部分,包括捕获列表、参数列表、返回类型和函数体。
- 生成闭包类:编译器会根据lambda表达式的内容生成一个匿名的闭包(或函数对象)类,该类用于封装lambda表达式的行为。这个类通常会包括捕获的外部变量、参数和函数体等成员。
- 生成函数调用运算符重载:闭包类中会定义函数调用运算符(
operator()
)的重载,用于实现lambda表达式的执行。该运算符的实现就是lambda表达式的函数体。 - 生成实际的lambda对象:编译器根据生成的闭包类和函数调用运算符,生成一个实际的lambda对象,该对象可以像函数一样被调用。
- 捕获外部变量:如果lambda表达式中使用了外部变量,编译器会根据捕获列表的要求,将这些变量以某种方式传递给闭包对象,使得在lambda表达式内部可以访问这些变量。
使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
int main()
{
int x = 10;
// 编译器自动推导出返回类型
/*auto square = [x](int num) {
return num * num + x;
}*/
// 显示定义 lamda 函数返回类型
auto square = [x](int num) -> int
{
return num * num + x;
}
std::cout << "Result: " << square(5) << std::endl; // 输出:Result:35
}
编译器会生成一个类似于函数对象的闭包类,实现了捕获外部变量和函数体的功能。运行时,可以像调用普通函数一样调用这个 lamda 表达式
会转化为下面的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class LambdaFunction{ public: LambdaFunction(int captured_x) : x(captured_x) {} int operator()(int num) const{ return num * num + x; } private: int x; } int main() { int x = 10; LamdaFunction square = LamdaFuntion(x); std::cout << "Result: " << square(5) << std::endl; // 输出:Result: 35 return 0; }
总结
lamda 匿名函数的实现原理,就是编译器将会生成一个类,该类的构造函数的参数为 lamda 函数的捕获参数;该类的函数调用操作符函数的参数为 lamda 函数的参数列表;函数调用操作符函数的函数体为 lamda 函数体
写在最后
感谢你在茫茫人海中找到我🕵🏼
🎉你是第 个读者
㊗️ 你平安喜乐,顺遂无忧!
希望你读完有所收获~
🥂🥂🥂