我的理解是,在诸如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};
实际上并未命名使用__
的所有内容,只有出于展示目的的名称。
在运行时,一切都有固定的类型,没有生成代码。
std::function<int(int)>
可以存储上面的f
的副本,但是使用类型的擦除机制,该机制超出了该问题的范围。但是请注意,f
不是与std::function<int(int)>
相关的类型对象。C 具有多种多态性。
我也严重怀疑java/c#lambdas比您的其余代码更加jit。