gpt4 book ai didi

.net - .net 托管内存如何处理对象内的值类型?

转载 作者:行者123 更新时间:2023-12-04 16:38:04 26 4
gpt4 key购买 nike

public class MyClass
{
public int Age;
public int ID;
}

public void MyMethod()
{
MyClass m = new MyClass();
int newID;
}

据我了解,以下说法正确:
  • 引用 m 存在于堆栈中,并在 MyMethod() 退出时超出范围。
  • 值类型 newID 存在于堆栈中,并在 MyMethod() 退出时超出范围。
  • 假设不存在对该对象的其他引用,则 new 运算符创建的对象存在于堆中,并在 MyMethod() 退出时由 GC 回收。

  • 这是我的问题:
  • 对象中的值类型是存在于栈中还是堆中?
  • 装箱/拆箱对象中的值类型是否值得关注?
  • 是否有关于此主题的任何详细但易于理解的资源?

  • 从逻辑上讲,我认为类中的值类型会在堆中,但我不确定是否必须将它们装箱才能到达那里。

    编辑:

    本主题推荐阅读:
  • CLR Via C# by Jeffrey Richter
  • Essential .NET by Don Box
  • 最佳答案

    类的值类型值必须与托管堆中的对象实例一起存在。方法的线程堆栈仅在方法的持续时间内有效;如果该值仅存在于该堆栈中,它如何保持不变?

    托管堆中类的对象大小是其值类型字段、引用类型指针和附加 CLR 开销变量(如 Sync 块索引)的总和。当为对象的值类型字段赋值时,CLR 会将值复制到对象内为该特定字段分配的空间。

    以具有单个字段的简单类为例。

    public class EmbeddedValues
    {
    public int NumberField;
    }

    有了它,一个简单的测试类。
    public class EmbeddedTest
    {
    public void TestEmbeddedValues()
    {
    EmbeddedValues valueContainer = new EmbeddedValues();

    valueContainer.NumberField = 20;
    int publicField = valueContainer.NumberField;
    }
    }

    如果使用 .NET Framework SDK 提供的 MSIL Disassembler 来查看 EmbeddedTest.TestEmbeddedValues() 的 IL 代码
    .method public hidebysig instance void  TestEmbeddedValues() cil managed
    {
    // Code size 23 (0x17)
    .maxstack 2
    .locals init ([0] class soapextensions.EmbeddedValues valueContainer,
    [1] int32 publicField)
    IL_0000: nop
    IL_0001: newobj instance void soapextensions.EmbeddedValues::.ctor()
    IL_0006: stloc.0
    IL_0007: ldloc.0
    IL_0008: ldc.i4.s 20
    IL_000a: stfld int32 soapextensions.EmbeddedValues::NumberField
    IL_000f: ldloc.0
    IL_0010: ldfld int32 soapextensions.EmbeddedValues::NumberField
    IL_0015: stloc.1
    IL_0016: ret
    } // end of method EmbeddedTest::TestEmbeddedValues

    注意 CLR 被告知 stfld 将堆栈中加载的值“20”到加载的 EmbeddValues 的 NumberField 字段位置,直接进入托管堆。同样,在检索值时,它使用 ldfld 指令将值从托管堆位置直接复制到线程堆栈中。这些类型的操作不会发生装箱/拆箱。

    关于.net - .net 托管内存如何处理对象内的值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24829/

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