<分区>
据我了解,在C#/Java等托管语言中,匿名函数是由编译器在运行时生成的,然后JIT编译到程序中。
在 Rust 和 C++ 等非托管语言中呢?这些语言如何在运行时创建函数?实现 lambda 表达式的底层细节是什么?
<分区>
据我了解,在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};
凡是 __
的地方in the name is not actually named, just given names for exposition purposes.
在运行时,一切都有固定的类型,不会生成代码。
std::function<int(int)>
可以存储 f
的拷贝上面,但它使用了超出此问题范围的类型删除机制。但是请注意,f
不是与 std::function<int(int)>
相关类型的对象; C++有不止一种多态性。
我也严重怀疑 Java/C# lambda 是否比您的代码的其余部分更 JIT。
关于c++ - AOT编译语言是如何实现匿名函数的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49652147/