我想创建一个能够存储10 ^ 9个数字的数组(long int)。如果我尝试这样做,我的编译器会崩溃。在C ++中允许的最大数量大小。如果我动态地这样做我也是得到同样的问题。我怎么能完成我想要实现的任务? 谢谢,任何帮助将不胜感激。
答案 0 :(得分:8)
最大数组大小取决于您存储的数据(以及可用于索引它们的整数)。
所以在32位系统上,如果你很幸运,你最多只能索引2³2个元素,这有点高于10⁹。在64位系统上,你可以索引2⁶⁴个元素,这个元素有点高于10 15。这基本上是最大数组大小。能够索引并不意味着您实际上也可以从操作系统中获得那么多,因为实际的虚拟地址空间可能要小得多。在Linux上,虚拟地址空间约为。在64位上每个进程可以使用64 TB,这是2⁴字节。
但是,如果你真的尝试分配它,你需要那么多的字节!因此,如果您尝试分配long int
的数组(可能是64位大小),则需要8 GB的内存。
在32位系统上,这是不可能的。在64位系统上,您需要有相当数量的ram和交换空间才能工作。
如果您使用的是32位系统或没有足够内存的64位系统,则会出现内存不足错误,这可能就是您看到的行为的原因。
如果您还尝试在可执行文件的.data部分中静态创建数组,则可执行文件最终可能会大8 GBytes,您可能遇到文件系统限制(fat32任何人?)。此外,编译器可能会扼杀数据量(在32位上,它可能会崩溃)。
如果你在堆栈上分配(这是一个静态大小的局部变量数组),你也会在某些操作系统上遇到堆栈限制。
答案 1 :(得分:6)
10 ^ 9长的数组通常会占用至少4GB的内存,这在所有32位系统中都已经过高。
即使在64位系统中有这么多内存,你当然不能指望在堆栈上分配4GB这样的内容:
void foo() {
long arr[1000000000]; // stack size is a typically few MBs!
}
答案 2 :(得分:2)
我想创建一个数组
你真的需要一个阵列吗?换句话说,您是否需要将整数放在一个内存块中,或者只是想通过索引访问它们?如果您不关心内存布局,但仍希望快速访问元素,则应使用std::deque
。它不是分配一块内存,而是将你的数字存储在许多小块中,所以只要你有足够的内存来存储所有数字,你就没事了。
答案 3 :(得分:1)
我不认为这是你的编译器崩溃,它是你的内存崩溃(内存不足或类似的东西),例如在Windows 32位,最多你可以使用2 ^ 32位的内存空间小于10 ^ 9 * 64所以你会得到内存异常。您可以通过分页并将较小的部分从文件加载到内存来使用它。
编辑正如Tobias Langner在评论中提到的,编译器也可能引发此错误,但原始问题来自内存。