- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我this MSDN Magazine article,作者指出(重点是我):
Note that boxing always creates a new object and copies the unboxed value's bits to the object. On the other hand, unboxing simply returns a pointer to the data within a boxed object: no memory copy occurs. However, it is commonly the case that your code will cause the data pointed to by the unboxed reference to be copied anyway.
最佳答案
这篇文章是准确的。但是,它讨论的是实际发生的情况,而不是编译器生成的IL的样子。毕竟,.NET程序永远不会执行IL,它会执行JIT编译器从IL生成的机器代码。
实际上,unbox操作码会生成代码,该代码会生成指向堆中代表值类型值的位的指针。 JIT生成对CLR中名为“JIT_Unbox”的小型辅助函数的调用。 clr\src\vm\jithelpers.cpp(如果您已获得SSCLI20源代码)。 Object::GetData()函数返回指针。
从那里,最常见的值首先被复制到CPU寄存器中。然后可以将其存储在某个位置。它不一定是堆栈,它可以是引用类型对象(gc堆)的成员。或一个静态变量(加载程序堆)。或者可以将其压入堆栈(方法调用)。或在表达式中使用该值时,也可以按原样使用CPU寄存器。
调试时,右键单击编辑器窗口,然后选择“转到反汇编”以查看机器代码。
关于.net - 拆箱是否仅返回指向堆上装箱的对象中的值的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2978647/
我是一名优秀的程序员,十分优秀!