0

MSDN unbox确实

  1. 对象引用被压入堆栈。
  2. 对象引用从堆栈中弹出并拆箱到值类型指针。
  3. 值类型指针被压入堆栈。

在这种情况下,对象引用不是与值类型指针相同吗?(这两个值都是堆中值类型的地址,因为值类型是对象中的唯一成员)?

例如,一个元素数组:数组的地址与数组的第一个元素的地址相同。

void Main()
{
    int[] test = new []{1};
    unsafe
    {
        fixed (int* x = test)
        {
            fixed (int* y = &test[0])
            {
                Console.WriteLine((int)x);
                Console.WriteLine((int)y); // They are equal
            }
        }
    }
}
4

1 回答 1

3

为什么需要拆箱成值类型指针?

由 280Z28 编辑:unbox指令产生一个指向数据的指针,以允许基于以下内容的(潜在)运行时性能优势:

ECMA 335 第三部分§4.32(摘录):

box复制值类型以在对象中使用所需的unbox不同,不需要从对象复制值类型。通常它只是计算已存在于装箱对象内部的值类型的地址。

unbox.any指令是在添加泛型类型时添加到 CIL 中的。与 不同unbox的是,该指令将值本身放在堆栈上,而不是指向该值的指针。

结束 280Z28

在这种情况下,对象引用不是与值类型指针相同吗?

不,对象引用指的是一个对象。值类型指针指向一个值。

想象一下,你有一张纸,上面写着数字 12。你把那张纸放在一个盒子里,然后把盒子放在仓库里。这张纸的位置显然盒子的位置有关,但与盒子的位置并不完全相同。托管引用是框的位置。值类型指针是一张纸的位置。仓库是托管堆。

也许这会有所帮助。将盒装int视为int[]一个元素。数组的位置与数组的第一个元素的位置不同,对吧?拆箱本质上是取消引用数组。

两个值都是堆中值类型的地址吗?

不,一个值是对对象的引用。另一个是指向值类型的托管指针。

A行或B行是否创建了m的新副本(抽象地在IL中,而不是机器代码)?

我一生都无法理解您在这个问题中要问什么。

于 2013-05-21T17:07:10.110 回答