ECMA 335 I.12.4.1 メソッド呼び出しより
ローカル変数配列は、オブジェクト型、およびオブジェクトを保持する値型内のフィールドに対して常に null を持ちます。さらに、
.locals init
が設定されている場合、ローカル変数配列は、整数型の場合は 0 に、浮動小数点型の場合は 0.0 に初期化されます。値の型は CLI によって初期化されませんが、検証されたコードは、メソッドのエントリ ポイント コードの一部として初期化子への呼び出しを提供します。
そう
「整数型の場合は 0 に初期化され、浮動小数点型の場合は 0.0 に初期化される」とは、「値の型をゼロにする」ことを意味しますか?
それは意味しますか:
.locals init
CLI は、メソッドのエントリ時にオブジェクト タイプが null に設定されていることを常に確認する必要がありますか? では、なぜここでオブジェクト型と値型を区別するのですか?ゼロアウト値型はゼロアウトオブジェクト型と似ていませんか?「値の型が CLI によって初期化されない」ことを理解する方法は?
これはどういう意味ですか: 「検証済みコードは、メソッドのエントリ ポイント コードの一部として初期化子への呼び出しを提供します」? 検証は CLI の一部ではありませんか?
ECMA 335 III.1.8.1.1 検証アルゴリズムより
検証可能な方法が
.locals init
設定されている必要があります。設定されていない場合、CLI はVerificationException
、アセンブリが許可されていない場所を スローする可能性がありますSecurityPermission.SkipVerification
。CLI は、CIL からネイティブ コードへのコンパイラがこの要件に対するパフォーマンスへの影響を最小限に抑えることができるように、(読み取り前に書き込まれる場所を決定するために) 明確な代入分析を実行することをオプションで選択できます。
が設定されている場合.locals init
、仕様では、CLI がメソッドのエントリ時にローカル変数配列をゼロにする必要があります。これは、エントリ時にゼロ化マシン コードを実行する必要があることを意味します。では、おそらく不必要なゼロ化がすでに行われていることを考えると、「明確な代入分析」はどのように役立つのでしょうか?
私が自分自身を明確にしなかった場合はお詫び申し上げます。コメントに基づいて質問を改善するために最善を尽くします。