如何知道内存分配给引用和值类型?

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

但是,如果在类中有方法并且变量是在方法内声明的,或者它是一个参数,则分配给堆栈的内存。

public class A
{
    int x; // heap

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

我如何看到内存分配的位置?


当你说'内存在哪里'时,我假设你指的是赋予变量的实际虚拟地址,也可能是它驻留在专用字节中的承诺块或区域。 由于它可能会被移动(这就是为什么本机互操作开发人员必须在使用前固定内存的原因),尽管这种微不足道的事情可能会发生,但您可以搜索类似于以下内容的变量位置:

鉴于源(和断点):

资源

允许反汇编(选项 - >调试 - >常规 - >显示反汇编...)右键单击(上下文菜单):选择“去反汇编”

请注意z:

mov dword ptr [ebp-44h],eax

打开寄存器窗口(Debug - > Windows - > Registers)。 请注意EBP(基址指针)== 0x05C0EF18的值。

使用calc(程序员模式)从上面确定[ebp-44h]。 0x05C0EF18 - 0x44 == 0x05C0EED4

查看该内存位置(调试 - > Windows - >内存 - >内存1)粘贴结果值(本例为0x05C0EED4)。

请注意价值

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

我们可以确定(现在)z位于0x05C0EED4,并且存储在它的位置中有1234567(十进制)。

然而,x有点复杂。 x位于EAX + 4。

// Similar exercise as above... 
// values get moved into registers, then the assignment...
mov eax,dword ptr [ebp-3Ch]  // [ebp-3Ch] == 0x05C0EF18 - 0x3C == 0x05C0EEDC 
                             // Move the value at 0x05C0EEDC (7c d4 40 02) to EAX
                             // [7c d4 40 02] (Big Endian) --> [02 40 d4 7c] (Little Endian)
                             // [02 40 d4 7c] (Little Endian) == 0x0240d47c or 37803132 (decimal)

mov edx,dword ptr [ebp-40h]  // [ebp-40h] == 0x05C0EF18 - 0x40 == 0x05C0EED8
                             // Move the value at 0x05C0EED8 (87 d6 12 00) to EDX
                             // [87 d6 12 00] (Big Endian) --> [00 12 d6 87] (Little Endian)
                             // [00 12 d6 87] (Little Endian) == 0x0012d687 or 1234567 (decimal)

mov dword ptr [eax+4],edx    // [EAX == 0x0240d47c] + 4 = 0x240D480
                             // Move the value at EDX (0x0012d687 or 1234567 (decimal)) to 
                             // EAX+4 (x variable located at 0x240D480)
                             //       (currently holds [b1 cb 74 00] (Big Endian)
                             //       which is equal to 7654321 (decimal)

但是,也有趣的是虚拟内存映射。 使用sysinternals中的vmmmap.exe可以更好地了解保留页面和已提交页面。 然后,你可以在GC等不同世代中徘徊

虚拟内存

希望这可以帮助!

链接地址: http://www.djcxy.com/p/14073.html

上一篇: How to know where memory is allocated for the reference and value type?

下一篇: Size of type and memory allocation