F#自动内联一些函数,甚至认为它们没有标注`inline`,这是有意的吗?

时间:2013-07-28 02:56:11

标签: f# inline

看起来F#会自动内联一些功能,即使它们没有标注“内联”。

let a x= x + 3
let b x= x * x

let funB x y =
    if x > y then 3
    else 1

let funC x =
    let s = a x
    let c = funB s (b x)
    c + 1

通过检查IL,我看到编译器已经积极地内联funB& a,b

funC:
IL_0000:  nop         
IL_0001:  ldarg.0     
IL_0002:  ldc.i4.3    
IL_0003:  add         
IL_0004:  stloc.0     // s
IL_0005:  ldarg.0     
IL_0006:  ldarg.0     
IL_0007:  mul         
IL_0008:  stloc.1     
IL_0009:  ldloc.0     // s
IL_000A:  ldloc.1     
IL_000B:  ble.s       IL_0011
IL_000D:  ldc.i4.3    
IL_000E:  nop         
IL_000F:  br.s        IL_0013
IL_0011:  ldc.i4.1    
IL_0012:  nop         
IL_0013:  ldc.i4.1    
IL_0014:  add         
IL_0015:  ret

这种行为对我来说很奇怪。我原以为编译器应该只有内联inline关键字。有没有提到它的参考文献?

1 个答案:

答案 0 :(得分:2)

inline关键字是强制编译器内联函数的一种方式,因此允许函数将类型作为参数并提高性能。没有理由让编译器不能内联函数,因为它认为适合发布版本。