来自 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 在方法入口时必须将局部变量数组归零。这意味着需要在进入时执行归零机器代码。那么,鉴于可能不必要的归零已经完成,“明确的分配分析”将如何提供帮助?
抱歉,如果我没有说清楚。我会尽力根据评论改进我的问题。