如何理解EMCA 335中关于`.locals init`的这些段落?
来自ECMA 335 I.12.4.1方法调用
局部变量数组对于对象类型以及包含对象的值类型中的字段始终为null。 此外,如果设置了
.locals init
,则局部变量数组初始化为0表示整数类型,0.0表示浮点类型。 CLI不会初始化值类型,但validation的代码将作为方法入口点代码的一部分提供对初始化程序的调用。
所以
-
“对于整数类型初始化为0,对于浮点类型初始化为0.0”是否意味着“将值类型归零”?
-
这是否意味着:无论
.locals init
,CLI必须始终确保在方法输入时将对象类型设置为null? 那么为什么它在这里区分对象类型和值类型:是不是零值类型类似于零对象类型? -
如何理解“CLI没有初始化”值类型“?
-
这是什么意思:“经过validation的代码将提供对初始化程序的调用,作为方法入口点代码的一部分”? 不是CLI的validation部分吗?
来自ECMA 335 III.1.8.1.1validation算法
可validation的方法应具有
.locals init
set。 如果未设置,CLI可能会抛出VerificationException
,其中程序集尚未被授予SecurityPermission.SkipVerification
。 CLI可以选择执行明确的赋值分析(以确定在读取之前写入哪个位置),以允许CIL到本机代码编译器最小化其对此要求的性能影响。
如果设置了.locals init
,则规范要求CLI必须在方法输入时将局部变量数组归零。 这意味着归零机器代码需要在进入时执行。 那么,鉴于可能不必要的归零已经完成,“明确的分配分析”将如何帮助?
如果我不清楚,请道歉。 我会尽力根据评论改进我的问题。
-
这只是说为存储整数类型而建立的任何内存,包括Byte,Short,Int,Long,UInt等都应该清除内存并将值设置为0,Float,Double等应该是0.0。 在.Net中,这是值类型的局部变量的预期默认值。
-
确保堆上的对象引用以指向null的地址开始可能需要不同的设置,而不是强制堆栈上的内存地址中的实际值为值类型的值为零。 因此,虽然对象始终为null,但如果设置了.locals init,则仅将值类型清零。
-
值类型没有构造函数。 在为变量标注尺寸时会分配内存,但在CLI中不会对值类型进行默认初始化调用。
-
听起来好像validation的代码比CLI直接提供的基本级别高,而且还需要值类型初始化。 但我只是猜测那一个。 有点像宣称它“不安全”与“管理”或其他什么。
-
这听起来像归零值CLI进行判断调用,因为它将值归零以决定它是否确实需要这样做。 但听起来这个选项并不总是可行的,具体取决于本机平台,或者取决于内存大小等。