2012-10-01 9 views
5

私はユビキタスJITインライン化がどのようにできるのか理解したいと思います。JITインライン展開で、自分のコードを.NETランタイムアセンブリコードにインライン展開できますか?

私のコードでは、System.IOというアセンブリからいくつかの関数を呼び出して、System.IO関数の中から呼び出されるために自分のコードに実装されている関数にコールバック参照を渡します。私の機能にはGetCallingAssembly()があります。したがって、私のコールバックがSystem.IOにインライン化された場合、元々私のコードにあったGetCallingAssembly()への呼び出しは、System.IOの中から呼び出された "現在の"メソッドが現在自分のコードの中から呼び出されると言うでしょう。

このようなインライン化は可能ですか、.NETランタイムアセンブリへのユーザーコードのJITインライン化が許可されないように.NETランタイムアセンブリが異なる方法で処理されていますか?

+1

デリゲートコールバックがコールバックインボーカにどのようにインライン化されるのでしょうか?それが意味をなさないかどうかわかりません...?私の理解では、インライン化は、呼び出されるコードが**証明可能な**シナリオ、すなわち静的呼び出し、または非仮想メソッドへの仮想呼び出しに限定されています。 –

+0

@マーク・グラベル:プログラム全体でコールバック呼び出し者の唯一の呼び出しであることが分かっていないのはなぜですか? – sharptooth

+0

これは、特に反射/メタプログラミングが存在するため(つまり、新しい呼び出し元が後で存在する可能性があるため)、JITがこれから実行するよりも、理解しようとする努力です。 –

答えて

3

コールバックがインライン化されないとは限りません。 .NET Frameworkのアセンブリは、インストール時に常にngen.exeによって事前にjitsされます。その後、そのコードを変更するオプションはありません。さらに、デリゲートを介したコールバックは、ジッタオプティマイザがデリゲートのターゲットメソッドが何であるかを推測できる場合でも、インライン化されることはありません。

関連する問題