装箱值类型是否与对象中的实际值类型具有相同的地址
本文关键字:类型 地址 是否 对象 | 更新日期: 2023-09-27 18:14:34
来自 MSDN unbox
- 对象引用被推送到堆栈上。
- 对象引用从堆栈中弹出,并取消装箱到值类型指针。
- 值类型指针被推送到堆栈上。
在这种情况下,对象引用不是与值类型指针相同吗?(这两个值都是堆中值类型的地址,因为值类型是对象中的唯一成员(?
例如,单元素数组:数组的地址与数组的第一个元素的地址相同。
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 中,而不是机器代码方面(?
我一辈子都无法理解你在这个问题上想问什么。