我想创建一个能够存储10 ^ 9个数字的数组(long int).如果我尝试这样做,我的编译器会崩溃.在C++中允许的最大大小数组.如果我动态地执行此操作,我也会得到相同的问题.我怎样才能完成我想要实现的任务?谢谢,任何帮助将不胜感激.
最大数组大小取决于您存储的数据(以及可用于索引它们的整数).
因此,在32位系统上,如果幸运的话,最多只能索引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位上,它可能会崩溃).
如果你在堆栈上分配(这是一个静态大小的局部变量数组),你也会在某些操作系统上遇到堆栈限制.
一个10 ^ 9长的数组通常会占用至少4GB的内存,这在所有32位系统中已经过高.
即使在64位系统中有这么多内存,你也不能指望在堆栈上分配4GB,如下所示:
void foo() {
long arr[1000000000]; // stack size is a typically few MBs!
}
Run Code Online (Sandbox Code Playgroud)
我不认为这是你的编译器崩溃,这是你的内存崩溃(内存不足或类似的情况),例如在Windows 32位中,最多你可以使用2^32位的内存空间,小于10^9* 64 所以你会得到内存异常。您可以通过分页并将较小的部分从文件加载到内存来使用它。
编辑:正如 Tobias Langner 在评论中提到的,编译器也可能会引发此错误,但原始问题来自内存。