ldloca についての備忘録

IL で ldloca を何で使っていたのか忘れてしまった。
再び参考文献「Expert .NET 2.0 IL Assembler」の
「Instance Members of Value Types」の内容を見返したとこです。
またすぐ忘れるので、早く思い出せるように内容を残しておこう。

「a」で終わる、IL のインストラクション

ldloca をはじめ「a」で終わる、IL のインストラクションには、
ldarga、ldsflda、ldflda などがあります。
これらは Value type に対して操作を行うときに関係があります。

そして内容の適当な要約です。

Value type も static や instance のメンバフィールドやメソッドを持つことができます。
その instance メンバにアクセスするなら、
アクセスする前に、その instance のポインタをスタックに積んでおきます。
value type ではその instance ポインタとして単純に、managed reference を使ってあげればいい。

その managed reference をスタックに積んでくれるのが、前述の 「a」で終わる IL インストラクションの仲間たちです。

call インストラクション

IL でインスタンスメソッドを呼び出すときは、通常 callvirt インストラクションを使います。
value type で managed reference をスタックに積んどいてインスタンスメソッドを呼ぶときは、call インストラクションを使います。

直値のインスタンスメソッド呼び出し

あと確か、直値、例えば、int の 「1」とかに対して、インスタンスメソッドを呼び出したいときは、
一時的な変数を用意し、それに代入してあげて、
その変数の managed reference をスタックに積んでインスタンスメソッドを呼び出さなければできないみたい。

例えばC#の次のコード

1.ToString();

を ILSpy で disassemble すると、こんな感じの IL になって出てきます。

IL_0029: ldc.i4.1
IL_002a: stloc.0
IL_002b: ldloca.s CS$0$0000
IL_002d: call instance string [mscorlib]System.Int32::ToString()