【发布时间】:2012-06-12 07:26:08
【问题描述】:
我想尝试分配一个 40 亿字节的数组,这是我的 C# 代码:
long size = 4 * 1000;
size *= 1000;
size *= 1000;
byte[] array = new byte[size];
此代码在包含new 的行上出现System.OverflowException 失败。好的,原来Length 返回int,所以数组长度也限制在int 可以存储的范围内。
那为什么没有编译时错误,并且允许long作为分配时的数组元素个数?
【问题讨论】:
-
Array.CreateInstance()给出更有意义的错误消息,“不支持大于 2GB 的阵列。” -
所以您分配了 3.7 GB 的内存。您的机器上安装了多少 RAM? :D
-
@Joso:这是一个 64 位进程,所以由于分页,它可以分配 3.7,因为有足够的磁盘空间。
-
即使分页也有其局限性。假设 1024 MB 物理 RAM,Windows 通常会将页面文件限制为 1536 MB。结合起来,您将能够分配 2560 MB 的内存。由于 Windows 将上页文件大小设置为物理内存的 1.5 倍,我会说物理 RAM 可能不是限制因素,但它是一个因素。
-
JoSo,(a) 没有一个头脑正常的人会在 1 GiB 内存上使用 64 位 Windows; (b) 现在内存非常便宜,所以任何小于 8 GiB 的内存都毫无意义; (c) 你读过答案吗?问题完全是另外一回事。
标签: c# .net memory-management buffer-overflow