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

时间:2018-04-04 13:21:11

标签: c++ function lambda rust closures

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

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

1 个答案:

答案 0 :(得分:2)

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};

其中名称中__的所有内容实际上都没有命名,只是为了说明而给出了名称。

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

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

我也非常怀疑Java / C#lambdas是否比其他代码更多JIT了。