3

背景:学校のプロジェクト用に.NETコンパイラ(C#に非常によく似ています)をプログラミングしています。現在追加しようとしている機能の1つは、メソッド内の末尾呼び出しの再帰です。

詳細:CILでは、「this」は単なる別の引数であるかのようにインスタンスメソッドに渡されます。したがって、静的メソッドの最初の引数にアクセスするとldarg.0が発行されますが、インスタンスメソッドの最初の引数にアクセスするとldarg.1が発行され、インスタンスメソッドの「this」にアクセスするとldarg.0が発行されます。 。(インスタンスメソッドは、私が想像していたよりも拡張メソッドにさらに似ています。)

質問:starg.0を使用して、副作用なしに「これ」を設定できますか?

これが問題となる理由:メソッドがインスタンスメソッドであるかどうかは、少しブラックボックスであるMethodBuilderで設定されます。「this」は他の引数とまったく同じように見えますが、一部のJITコンパイラは「this」を個別に追跡し、この値に応じて動作を変更することを知っています。インスタンスメソッドで「this」を設定したときに副作用がある場合、どうすればそれらを回避できますか?

4

2 に答える 2

2

F#が末尾呼び出しを実装する方法を確認することをお勧めします。

于 2012-02-08T23:51:18.727 に答える
1

これをローカル変数として抽出できます。このようにして、安全に設定できることがわかります。(私はあなたの質問を正しく理解したいと思います)

于 2012-02-08T23:46:17.263 に答える