如何理解EMCA 335中关于“.locals init”的这些段落
本文关键字:init 段落 locals EMCA 何理解 | 更新日期: 2023-09-27 18:22:22
来自ECMA 335 I.12.4.1方法调用
对于对象类型和包含对象的值类型中的字段。此外,如果设置
.locals init
,则局部变量数组初始化为0对于积分类型为0.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必须在方法条目时将本地变量数组归零。这意味着调零机器代码需要在输入时执行。那么,考虑到可能不必要的归零已经完成,"确定分配分析"会有什么帮助呢?
如果我没有说清楚,我道歉。我会尽力根据评论改进我的问题。
-
这只是说,任何为存储整数类型(包括Byte、Short、Int、Long、UInt等)而建立的内存都应该清除该内存,并将值设置为0,Float、Double等应该为0.0。在.Net中,这是值类型的局部变量的预期默认值。
-
确保堆上的对象引用以指向null的地址开始,可能需要与强制堆栈上内存地址中的实际值具有零值的值类型不同的设置。因此,虽然对象总是null,但只有在设置了.localsinit的情况下,值类型才会被置零。
-
值类型没有构造函数。对变量进行维度标注时会分配内存,但CLI中不会对值类型进行默认初始化调用。
-
听起来,经过验证的代码比CLI直接提供的基本级别高出一个级别,并且需要值类型初始化。但我只是猜测。有点像宣称它是"不安全的"与"有管理的"或其他什么。
-
这听起来像是当将值清零时,CLI会发出判断调用,因为它正在将值清零,以决定是否真的需要这样做。但这个选项听起来并不总是可行的,这取决于本机平台,或者取决于内存大小或其他什么。