什么是C#中的数组大小?

时间:2015-03-13 22:43:37

标签: c# arrays

我想创建两个200M int元素数组。像那样:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Arr
{
    class Program
    {

        static void Main(string[] args)
        {

            int Min = 0;
            int Max = 10;
            int ArrSize = 200000000;

            int[] test2 = new int[ArrSize];
            int[] test3 = new int[ArrSize];

            Console.ReadKey();

        }
    }
}

但是,在VS2013下,我发现内存不足异常,黄色箭头指向int[] test3 = new int[ArrSize];行。这台机器有12GB的RAM。

如果我将元素数量减少到150M,则不会抛出任何异常。

如果我只初始化一个大小为200M的数组,则不会抛出任何异常。

为什么?

1 个答案:

答案 0 :(得分:6)

  

机器有12GB的RAM。

会影响程序的速度(取决于程序的速度是多少),但物理内存大小对分配成功或失败没有影响。这取决于可用的地址空间。

如果您正在编译为32位,尤其是you are not using the /LARGEADDRESSAWARE option,那么您将只能分配少量大型对象,因为它们必须适合单个2GB地址空间,并且该空间是由DLL和其他分配分解。

如果您确实需要大型对象,那么使用64位是个好主意。对于32位程序,您可以通过将对象分成更小的块来部分解决这个问题,从而增加找到足够大的空闲区域空间的机会。

VS 2013中C#控制台应用程序的默认设置为“AnyCPU”,“首选32位”。

您可以在项目属性中更改此设置 - >构建标签。 enter image description here