12

生成されたコードが、静的メンバー (関数を含む) にアクセスするたびにクラスが初期化されているかどうかをチェックするとは思わない。すべてのアクセスをチェックするのは非効率的だと思います。ECMA 334 の §17.11 を見たところ、

静的コンストラクターの実行は、アプリケーション ドメイン内で次のイベントの最初の発生によってトリガーされます。

  • クラスのインスタンスが作成されます。
  • クラスの静的メンバーのいずれかが参照されています。

「最初」がいつ発生するかを把握する方法が定義されていないようです。毎回チェックする以外に方法が思いつきません。どのようにすればよいでしょうか?

4

2 に答える 2

17

解決すべき問題がある場合、良いテクニックは次のとおりです。小さな問題の解決策がより難しい問題の解決策によって解決されるように、さらに難しい問題を解決します。

CLR には、解決するのがはるかに困難な問題があります。メソッドが初めて呼び出される直前に、すべてのメソッドで正確に 1 回ジッターを実行する必要があります。CLR がその問題を解決できれば、静的 ctor をいつ実行する必要があるかを検出するという比較的些細なサブ問題を明らかに解決できます。

おそらく、あなたの質問は、「ジッターはメソッドを初めて jit するタイミングをどのように知るのでしょうか?」ということになるはずです。

于 2012-02-17T21:40:12.077 に答える
5

実行時にコードを生成する場合、多くのオプションがあります。NULL 関数ポインターを呼び出し、アクセス違反をキャッチし、静的コンストラクターを実行し、プロパティ ゲッターをコンパイルし、関数ポインターを更新して続行できます。または、静的コンストラクターを実行するヘルパー関数をプロパティ ゲッターで呼び出し、ヘルパー関数呼び出しなしでゲッター コードを書き換えます。または、すべての静的メンバーへのアクセスにチェックを挿入します。ヒットすると、チェックが削除されて呼び出し元の関数が再コンパイルされます。

于 2012-02-17T21:31:35.617 に答える