gpt4 book ai didi

c# - F# 内联如何工作?

转载 作者:可可西里 更新时间:2023-11-01 08:10:27 24 4
gpt4 key购买 nike

据我所知,对于 F#,您可以使用 inline 关键字在调用站点执行类型特化。即::

val inline (+) : ^a -> ^b -> ^c
when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)

约束 ^a^b 必须有一个静态成员,如 op_Addition,或内置原语之一,可以是用于填补空白。

因此,如果您有一个带有 + 的方法,并且您传入一个 int 和一个 short 作为参数,它会将 + 展开为一条指令,以使用 int 的内置原语,如果您传入一个 float 和一个 byte,它使用 float 原语加法操作码。

这在编译时究竟是如何完成的?您如何在 CLR 中使用一种方法来根据类型切换它使用的操作码或方法?

Reflection.Emit 可以实现这种行为吗?我知道内联是在调用站点执行的,这是否意味着代码不适用于 C#?

最佳答案

正如 inline 所建议的,代码在调用站点内联。在每个调用站点,您都知 Prop 体类型参数 ^T,因此会在此处插入该类型的特定代码。

这是由 F# 编译器完成的,您不能在其他上下文(如 C# 或 Ref.Emit)中轻松完成。

F# 库有一些仍然可以被其他语言调用的内联函数,这些实现的运行时根据运行时类型进行动态调度,参见例如F# Core 库代码中 prim-types.fsAdditionDynamic 的代码,感受一下。

关于c# - F# 内联如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4413324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com