c# - 数组的大小是否受制于int的上限(2147483647)?

标签 c# arrays int integer-overflow

我正在做一些 Project Euler练习,我遇到了一个场景,我想要大于 2,147,483,647(C# 中 int 的上限)的数组。

当然这些都是大数组,但是例如,我不能这样做

// fails
bool[] BigArray = new BigArray[2147483648];

// also fails, cannot convert uint to int
ArrayList BigArrayList = new ArrayList(2147483648); 

那么,我可以有更大的阵列吗?

编辑: 这是一个 Sieve of Atkin ,你知道,所以我只想要一个非常大的 :D

最佳答案

任何时候你在处理这么大的数组时,你都应该尝试找到更好的解决方案。但话虽这么说,我仍然会尝试回答你的问题。

如本article所述.Net 中的任何对象都有 2 GB 的限制。对于所有 x86、x64 和 IA64。

As with 32-bit Windows operating systems, there is a 2GB limit on the size of an object you can create while running a 64-bit managed application on a 64-bit Windows operating system.

此外,如果您在堆栈上定义的数组太大,则会出现堆栈溢出。如果您在堆上定义数组,它将尝试将其全部分配到一个大的连续 block 中。最好使用在堆上具有隐式动态分配的 ArrayList。这不会让您超过 2GB,但可能会让您更接近它。

我认为只有在使用 x64 或 IA64 架构和操作系统时,堆栈大小限制才会更大。使用 x64 或 IA64,您将拥有 64 位可分配内存而不是 32 位。

如果您不能一次分配所有数组列表,您可能可以分段分配它。

在具有 6GB RAM 的 x64 Windows 2008 机器上使用数组列表并一次添加 1 个对象,我最多可以获得 ArrayList 的大小:134217728。所以我真的认为你必须找到一个更好的解决方案您的问题没有使用那么多内存。也许写入文件而不是使用 RAM。

关于c# - 数组的大小是否受制于int的上限(2147483647)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/573692/

相关文章:

c# - 如何制作带注释的滚动条?

java - println() 方法中的字符串连接

python - cython:使用 numpy.ctypeslib.ndpointer 将 float 组转换为 python 数组

c# - 查找数组元素的总和

c - 将整数数组传递给需要 C 中字符的函数

c# - 可移植 C# 数据库

c# - 当类型已知时,是否有任何技术原因在 C# 中使用或不使用 var?

c# - 实现父子类层次结构

types - Ocaml 类型错误

arrays - 迅速,将 NSIndexpath 转换为 Int