4

「インライン」とマークされていなくても、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コンパイラはキーワードがある場合にのみインライン化する必要があると考えていました。それについて言及した参照はありますか?

4

1 に答える 1