c++ - AOT编译语言是如何实现匿名函数的?

标签 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*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/

相关文章:

java - 带有 lambda 表达式的 PROLOG

c# - Entity Framework Lambda 优化

c++ - 使用std::enable_if限制派生类的模板参数时发生编译错误

c++ - c++线程安全的ssl支持的SOAP客户端

javascript - 是否可以在javascript中获取父函数名称?

r - 对 data.frame 中的每一行应用一个函数,并将结果附加到 R 中的 data.frame

c++ - 如何将包含 std::unique_ptr 的 std::optical 结构传递给函数?

c# - 如何正确地将 lambda 表达式的 "var"结果转换为具体类型?

c++ - 如何在windows中直接在屏幕上绘图?

c++ - 如何移动多个矩形作为碰撞响应?