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关键字是一种强制编译器内联函数的方法,因此允许函数将类型作为参数并提高性能.编译器没有理由不内联函数,因为它认为适合发布版本.

点赞