如何理解EMCA 335中关于`.locals init`的这些段落?

来自ECMA 335 I.12.4.1方法调用

局部变量数组对于对象类型以及包含对象的值类型中的字段始终为null。 此外,如果设置了.locals init ,则局部变量数组初始化为0表示整数类型,0.0表示浮点类型。 CLI不会初始化值类型,但validation的代码将作为方法入口点代码的一部分提供对初始化程序的调用。

所以

  1. “对于整数类型初始化为0,对于浮点类型初始化为0.0”是否意味着“将值类型归零”?

  2. 这是否意味着:无论.locals init ,CLI必须始终确保在方法输入时将对象类型设置为null? 那么为什么它在这里区分对象类型和值类型:是不是零值类型类似于零对象类型?

  3. 如何理解“CLI没有初始化”值类型“?

  4. 这是什么意思:“经过validation的代码将提供对初始化程序的调用,作为方法入口点代码的一部分”? 不是CLI的validation部分吗?

来自ECMA 335 III.1.8.1.1validation算法

可validation的方法应具有.locals init set。 如果未设置,CLI可能会抛出VerificationException ,其中程序集尚未被授予SecurityPermission.SkipVerification 。 CLI可以选择执行明确的赋值分析(以确定在读取之前写入哪个位置),以允许CIL到本机代码编译器最小化其对此要求的性能影响。

如果设置了.locals init ,则规范要求CLI必须在方法输入时将局部变量数组归零。 这意味着归零机器代码需要在进入时执行。 那么,鉴于可能不必要的归零已经完成,“明确的分配分析”将如何帮助?

如果我不清楚,请道歉。 我会尽力根据评论改进我的问题。

  1. 这只是说为存储整数类型而建立的任何内存,包括Byte,Short,Int,Long,UInt等都应该清除内存并将值设置为0,Float,Double等应该是0.0。 在.Net中,这是值类型的局部变量的预期默认值。

  2. 确保堆上的对象引用以指向null的地址开始可能需要不同的设置,而不是强制堆栈上的内存地址中的实际值为值类型的值为零。 因此,虽然对象始终为null,但如果设置了.locals init,则仅将值类型清零。

  3. 值类型没有构造函数。 在为变量标注尺寸时会分配内存,但在CLI中不会对值类型进行默认初始化调用。

  4. 听起来好像validation的代码比CLI直接提供的基本级别高,而且还需要值类型初始化。 但我只是猜测那一个。 有点像宣称它“不安全”与“管理”或其他什么。

  5. 这听起来像归零值CLI进行判断调用,因为它将值归零以决定它是否确实需要这样做。 但听起来这个选项并不总是可行的,具体取决于本机平台,或者取决于内存大小等。