据我了解,在C#/ Java等托管语言中,编译器在运行时生成匿名函数,然后将JIT编译到程序中。
在Rust和C ++等非托管语言中怎么样?这些语言如何在运行时创建函数?实现lambda表达式的低级细节是什么?
答案 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了。