|
1
7
这篇文章是准确的。但是它谈到了什么 真正地 继续,而不是编译器生成的IL。毕竟.NET程序从不执行IL,它执行由JIT编译器从IL生成的机器代码。 而unbox操作码确实会生成一个代码,该代码会产生一个指向堆中表示值类型值的位的指针。jit生成对clr中名为“jit_unbox”的小助手函数的调用。clr\src\vm\jithelpers.cpp如果您得到了sscli20源代码。函数的作用是:返回指针。 从那里,最常见的值首先被复制到一个CPU寄存器中。然后可能会被存储在某个地方。它不必是堆栈,它可以是引用类型对象(GC堆)的成员。或静态变量(加载器堆)。或者可以在堆栈上推送(方法调用)。或者,当在表达式中使用值时,可以按原样使用CPU寄存器。 调试时,右键单击编辑器窗口并选择“转到反汇编”以查看机器代码。 |
|
2
5
原始文章的作者一定是指在IL级别发生的事情。存在两个未装箱操作码:
根据msdn,
regarding
和
regarding
所以,作者知道他在说什么。
关于这个小事实
当然,当您在C级别工作时,您不能进行任何此类优化,因此通常会发生的情况是,编译器生成的代码几乎总是在进一步使用变量之前从装箱对象复制变量。 |
|
3
1
装箱是将值类型实例强制转换为引用类型实例(或
根据“C 4.0简而言之”:“…拆箱 副本 对象的内容返回到一个值类型实例中”,这意味着在堆栈上。 在您引用的文章中,作者声明:
|