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

时间:2013-07-15 01:22:24

标签: c# .net initialization clr jit

来自ECMA 335 I.12.4.1方法调用

  

局部变量数组对于对象类型和for总是为null   保存对象的值类型中的字段。另外,如果   设置.locals init,然后将局部变量数组初始化为0   对于整数类型,对于浮点类型为0.0。 CLI不会初始化值类型,但会进行验证   代码将作为方法的一部分提供对初始化程序的调用   入口点代码。

所以

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

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

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

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

  5. 来自ECMA 335 III.1.8.1.1验证算法

      

    可验证方法应设置.locals init。如果未设置,CLI可能会   抛出VerificationException,但未授予程序集   SecurityPermission.SkipVerification。 CLI可以选择选择   执行明确的分配分析(确定哪个位置   在读取之前编写)允许CIL到本机代码编译器   尽量减少对此要求的性能影响。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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