C++ 匿名函数是如何在AOT编译语言中实现的?

C++ 匿名函数是如何在AOT编译语言中实现的?,c++,function,lambda,rust,closures,C++,Function,Lambda,Rust,Closures,据我所知,在C#/Java等托管语言中,匿名函数由编译器在运行时生成,然后JIT编译到程序中 Rust和C++的非托管语言怎么样?这些语言如何在运行时创建函数?实现lambda表达式的底层细节是什么 int y = 3; auto f = [y](int x) { return x*y; }; 这是一个C++11 lambda。编译器(基本上)将其转换为: struct __anonymous_name__ { int operator()(int x) const { return x

据我所知,在C#/Java等托管语言中,匿名函数由编译器在运行时生成,然后JIT编译到程序中

<> Rust和C++的非托管语言怎么样?这些语言如何在运行时创建函数?实现lambda表达式的底层细节是什么

int y = 3;
auto f = [y](int x) { return x*y; };
这是一个C++11 lambda。编译器(基本上)将其转换为:

struct __anonymous_name__ {
  int operator()(int x) const { return x*y; }

  int y;
};
__anonymous_name__ f = {y};
其中名称中包含
\uuu
的所有内容实际上都没有命名,只是为了说明目的而命名

在运行时,所有内容都有一个固定的类型,不生成任何代码

std::function
可以存储上述
f
的副本,但它使用的类型擦除机制超出了本问题的范围。但是,请注意,
f
不是与
std::function
相关的类型的对象;C++有多种多态性,



我还严重怀疑Java/C#lambda是否比其他代码更适合JIT。

C++在运行时不会生成任何代码。它是一种编译语言,这只是java、C++和C++的一个<代码>语法糖>代码。编译器在编译时创建一个类实例或回调函数,唯一的区别是lambda未命名,这与使用另一种方法创建的回调不同。然后这个函数对象在运行时使用的方式和正常的一样。这可能因语言而异。谷歌搜索lambdas是如何在中实现的应该可以回答您的问题。我真诚地怀疑Java或C#lambdas是否比命名函数更为紧张。lambda仍然是编译时构造,不像(比如)eval样式的命令。在Rust中,lambda作为包含捕获变量的结构上的方法进行编译(在编译时)。所以没有运行时。AFAIK,在C++中,λ被转换成类,就像C++一样。这在Rust(struct+方法)中也是一样的。