C#中块中变量的名称会影响内存吗?

问题描述 投票:1回答:2

我注意到当我运行这段代码时:

{
    int[] a = new int[int.MaxValue / 8];
}
{
    int[] a = new int[int.MaxValue / 8];
}

我得到OutOfMemoryException。但如果我这样做:

{
    int[] a = new int[int.MaxValue / 16];
}
{
    int[] a = new int[int.MaxValue / 16];
}
{
    int[] a = new int[int.MaxValue / 16];
}
{
    int[] a = new int[int.MaxValue / 16];
}

没有例外。但是当我更改2个变量的名称时:

{
    int[] a = new int[int.MaxValue / 16];
}
{
    int[] a = new int[int.MaxValue / 16];
}
{
    int[] b = new int[int.MaxValue / 16];
}
{
    int[] b = new int[int.MaxValue / 16];
}

我再次得到OutOfMemoryException。

为什么在第一次和最后一次出现OutOfMemoryException而不是第二次使用相同数量的空间?

编辑:我明白第一个OutOfMemoryException是不同的,因为内存需要是连续的,但不是为什么第二个没有OutOfMemoryException但是第三个

c# exception out-of-memory
2个回答
1
投票

这是一个很好的问题,我不确定我是最好的回答,但我会试一试。

数组要求内存是连续的,这意味着它必须彼此相邻。因此,当你要求2个int.max / 8或大约5亿个整数数组时,你说我需要彼此相隔25亿个内存块,而不仅仅是10亿个内存块。当你再询问4个2.5亿个块时,这是同样的事情,你仍然要求10亿块内存但是在4 250个块中。至于为什么第三个失败了...这可能只是运气不好或垃圾收集器只是慢......不太确定。一旦你离开块就应该释放那个内存,所以命名它不一样真的很重要,虽然可能给它相同的变量名强制集合......我不是垃圾收集专家。


0
投票

变量名不影响内存,编译器实际上并不保存原始变量名。

© www.soinside.com 2019 - 2024. All rights reserved.