gpt4 book ai didi

.net - 拆箱是否仅返回指向堆上装箱的对象中的值的指针?

转载 作者:行者123 更新时间:2023-12-04 03:34:57 24 4
gpt4 key购买 nike

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.



我对加粗的句子及其后的句子感到困惑。从我读过的所有其他内容(包括 this MSDN page)中,我从未听说过拆箱仅返回指向堆中值的指针。我给人的印象是,与开始时一样,拆箱会导致您拥有一个在堆栈中包含值副本的变量。毕竟,如果我的变量包含“指向堆中值的指针”,那么我就没有值类型,而是有了指针。

有人可以解释这是什么意思吗?作者在崩溃吗? (文章中至少还有一个明显的错误)。如果是这样,那么在什么情况下“您的代码将导致反装箱引用所指向的数据仍然被复制”?

我只是注意到这篇文章已有近10年的历史了,所以也许这是在.Net的生命早期就改变了的东西。

最佳答案

这篇文章是准确的。但是,它讨论的是实际发生的情况,而不是编译器生成的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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com