C# 如何知道在哪里为引用和值类型分配内存?

C# 如何知道在哪里为引用和值类型分配内存?,c#,memory,memory-management,C#,Memory,Memory Management,如我所知,如果int变量(值类型)直接在类(引用类型)中声明,则堆上分配的变量内存 public class A { int x; // heap public void Func(int y) // stack { int z; // stack } } 但是,如果类中有一个方法,并且变量是在方法中声明的,或者它是一个参数,则在堆栈上分配的内存是 public class A { int x; // heap public

如我所知,如果int变量(值类型)直接在类(引用类型)中声明,则堆上分配的变量内存

public class A
{
    int x; // heap

    public void Func(int y) // stack
    {
        int z;  // stack
    }
}
但是,如果类中有一个方法,并且变量是在方法中声明的,或者它是一个参数,则在堆栈上分配的内存是

public class A
{
    int x; // heap

    public void Func(int y) // stack
    {
        int z;  // stack
    }
}

我怎样才能看到内存分配在哪里?

当你说“内存在哪里”时, 我假设你是指给变量的实际虚拟地址, 可能还有它驻留在私有字节中的提交块或区域。 而这件小事充其量只是因为它可能会被移动 (这就是为什么本机互操作开发人员必须在使用前锁定内存), 您可以查找类似以下内容的可变位置:

给定源(和断点):

允许反汇编(选项-->调试-->常规-->显示反汇编…) 右键单击(关联菜单):选择“转到反汇编”

注意z的赋值:

mov dword ptr [ebp-44h],eax
打开寄存器窗口(调试-->窗口-->寄存器)。 注意EBP(基本指针)=0x05C0EF18的值

使用计算器(编程器模式)从上面确定[ebp-44h]。 0x05C0EF18-0x44==0x05C0EED4

查看该内存位置(调试-->窗口-->内存-->内存1) 粘贴结果值(此实例为0x05C0EED4)

注意这个值

 87 d6 12 00 // <-- Little Endian  (00 12 d6 87 <-- Big Endian)
             //     0x0012D687 (hex) == 1234567 (decimal)

然而,同样有趣的是虚拟内存映射。使用sysinternals中的vmmmap.exe可以更好地了解保留页面和提交页面。然后,您可以在GC中浏览不同的代,等等


希望这有帮助

请看这个,这是关于asp.net框架中通过垃圾收集完成的内存管理。谢谢,这是一个很好的答案=)