装箱值类型是否与对象中的实际值类型具有相同的地址

本文关键字:类型 地址 是否 对象 | 更新日期: 2023-09-27 18:14:34

来自 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
            }
        }
    }
}

装箱值类型是否与对象中的实际值类型具有相同的地址

为什么它需要拆箱到值类型指针中?

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

ECMA 335 分区 III §4.32(摘录(:

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

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

结束 280Z28

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

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

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

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

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

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

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

我一辈子都无法理解你在这个问题上想问什么。