首页 C++ 中 lamda 表达式的实现原理
文章
取消

C++ 中 lamda 表达式的实现原理

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表达式的实现原理大致可以分为以下几个步骤:

  1. 词法分析和语法分析:编译器首先对lambda表达式进行词法分析和语法分析,将其分解为各个组成部分,包括捕获列表、参数列表、返回类型和函数体。
  2. 生成闭包类:编译器会根据lambda表达式的内容生成一个匿名的闭包(或函数对象)类,该类用于封装lambda表达式的行为。这个类通常会包括捕获的外部变量、参数和函数体等成员。
  3. 生成函数调用运算符重载:闭包类中会定义函数调用运算符(operator())的重载,用于实现lambda表达式的执行。该运算符的实现就是lambda表达式的函数体。
  4. 生成实际的lambda对象:编译器根据生成的闭包类和函数调用运算符,生成一个实际的lambda对象,该对象可以像函数一样被调用。
  5. 捕获外部变量:如果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 函数体

写在最后

感谢你在茫茫人海中找到我🕵🏼

🎉你是第 个读者

㊗️ 你平安喜乐,顺遂无忧!

希望你读完有所收获~

🥂🥂🥂

本文由作者按照 CC BY 4.0 进行授权

Macos 使用 conda 创建 python3.7 虚拟环境失败

c++ 中的template/模版