10

我想创建一个能够存储 10^9 数字(long int)的数组。如果我尝试这样做,我的编译器会崩溃。C++ 中允许的最大数组大小是多少。另外,如果我也动态地这样做,我会得到相同的结果问题。我怎样才能完成我想要完成的任务?谢谢,任何帮助将不胜感激。

4

4 回答 4

11

最大数组大小取决于您存储的数据(以及可用于索引它们的整数)。

所以在 32 位系统上,如果幸运的话,最多只能索引 2³² 个元素,这略高于 10⁹。在 64 位系统上,您可以索引 2⁶⁴ 元素,这略高于 10¹⁹。这实际上是最大数组大小。能够索引并不意味着您实际上也可以从操作系统中获得那么多,因为实际的虚拟地址空间可能要小得多。在 Linux 上,一个虚拟地址空间约为。在 64 位上,每个进程可用 64 TB,即 2⁴² 字节。

但是,如果您真的尝试分配它,您需要那么多字节!因此,如果您尝试分配一个long int大小可能为 64 位的数组,则需要 8 GB 的内存。

在 32 位系统上,这是不可能的。在 64 位系统上,您需要有一定数量的 ram 和交换空间才能工作。

如果您在 32 位系统或 64 位系统上没有足够的内存,您将收到内存不足错误,这可能是您看到的行为的原因。

如果您还尝试在可执行文件的 .data 部分中静态创建数组,则可执行文件最终可能有 8 GB 大,您可能会遇到文件系统限制(fat32 任何人?)。此外,编译器可能会阻塞数据量(在 32 位上,它可能会崩溃)。

如果您在堆栈上分配(即作为静态大小的局部变量数组),您还将在某些操作系统上遇到堆栈限制。

于 2012-07-06T08:24:29.090 回答
7

一个 10^9 长的数组通常会占用至少 4GB 的内存,这在所有 32 位系统中已经是令人望而却步的了。

即使在 64 位系统中有这么多内存可用,您当然不能期望像这样在堆栈上分配 4GB:

void foo() {
    long arr[1000000000]; // stack size is a typically few MBs!
}
于 2012-07-06T08:23:20.793 回答
2

我想创建一个数组

你真的需要一个数组吗?换句话说,您是要求整数位于一个内存块中,还是只想通过索引访问它们?如果您不关心内存布局,但仍希望快速访问元素,则应使用std::deque. 它不会分配一块内存,而是将您的数字存储在许多小块中,因此只要您有足够的内存将所有数字存储在一起,就可以了。

于 2012-07-06T08:34:02.397 回答
2

我不认为这是您的编译器崩溃,而是您的内存崩溃(内存不足或类似情况),例如在 Windows 32 位中,您最多可以使用 2^32 位小于 10^9* 的内存空间64 所以你会得到内存异常。您可以通过分页并将较小部分从文件加载到内存来使用它。

编辑:正如 Tobias Langner 在评论中提到的,编译器也可能引发此错误,但原始问题来自内存。

于 2012-07-06T08:19:39.287 回答