gpt4 book ai didi

c# - 对值类型的困惑

转载 作者:行者123 更新时间:2023-11-30 13:34:46 25 4
gpt4 key购买 nike

如果我声明一个 Object 类的实例,我对一点感到困惑。它将保留在堆上,但是当我声明时,任何派生自 System.ValueType 的原始类型实例进一步派生自 Object 类,然后 Object 类使用的部分也保留在堆栈上。

为什么会这样,或者说 Object 类不占用空间?

最佳答案

你的推理似乎是这样的:

  • System.Int32 派生自 System.Object
  • 派生类型总是以与其基类型相同的方式在内存中布局
  • 因此,System.Int32 在内存中的布局与 System.Object 相同

是吗?

第二个前提是错误的。推导和内存布局几乎没有任何关系。你相信这个前提是真的吗?如果是这样,是什么让您相信它?

更新:我认为描述对值类型的方法调用是如何工作的会很有帮助。

假设您有一个值类型:

struct S { 
public int x;
public override string ToString() { return "Hello!" + x; }
}
...
S s = new S();
s.x = 0x00112233;
s.ToString();

我们生成什么代码?代码是这样做的:

  • 在堆栈上为 s.x 保留四个字节。
  • 将字节 00 11 22 33 写入该内存。
  • 调用 S.ToString 方法,传递对我们刚刚在堆栈上分配的内存位置的引用。

为什么我们需要在堆栈上存储 s.x 的四个字节以外的任何内容?我们已经拥有执行调用所需的一切:对包含 S 实例的变量的引用,以及我们正在调用的确切方法实现的确切名称和位置。无需在任何地方存储与 System.Object 有关的任何内容。没有“对象类使用的部分”;我们不需要这样的东西,所以没有这样的东西。

关于c# - 对值类型的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2165229/

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