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

use*_*081 1 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();

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在VS2013下,我出现了内存异常,黄色箭头指向上int[] test3 = new int[ArrSize];线.这台机器有12GB的RAM.

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

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

为什么?

Ben*_*igt 6

这台机器有12GB的RAM.

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

如果你正在编译为32位,特别是如果你没有使用该/LARGEADDRESSAWARE选项,那么你将只能分配一些大型对象,因为它们必须适合单个2GB地址空间,并且该空间被分解通过DLL和其他分配.

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

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

您可以在"项目属性" - >"构建"选项卡上更改此设置. 在此输入图像描述

  • @Xantix:当我说"空间被打破"时,我说的是连词.如果您正在查看Free RAM,那么您完全错过了这一点,因为分配失败是由于缺少(连续)地址空间而不是缺少RAM造成的.如果缺少RAM,则使用交换文件. (2认同)