【问题标题】:Error: Total size of array must not exceed 0x7fffffff bytes错误:数组的总大小不得超过 0x7fffffff 字节
【发布时间】:2017-06-29 14:35:12
【问题描述】:

我有一个需要大型二维数组的小型 C++ 程序。

int distanceArray[282][9900000];

我知道,由于 32 位应用程序的 2GB 上限,标准的 32 位控制台应用程序将无法为我的进程分配这么多内存。但是,尽管我已将编译器配置为使用本机 amd64 工具集,但在尝试构建应用程序时仍然会遇到相同的错误:

Error   C2148   total size of array must not exceed 0x7fffffff bytes

我的系统上有 16GB 的 RAM,所以我知道我的物理内存应该不是问题。如果我的计算是正确的,这应该只占用大约 3GB。但是,我不明白为什么我似乎无法让 64 位编译器正常工作。我遵循了Microsoft's website 上的说明,其中概述了如何使用 64 位编译器,但无论我做什么,我都会收到同样的错误。任何帮助将不胜感激。谢谢!

我知道以前有人问过这个问题,但现有的答案对我没有帮助。感谢您尝试帮助我找到我的问题。

【问题讨论】:

  • 你的堆栈可能溢出了。这与进程的总可用内存不同。请改用std::vector<std::vector<int>> 或其他名称。
  • 这通常不会在运行时导致错误吗?我什至无法正确编译。
  • 那似乎是编译器特定的事情。我无法复制here。您可能应该添加有关您的特定开发环境的标签和说明。
  • 不管怎样,如果你让它在这种状态下运行,它肯定会非常严重地溢出堆栈。
  • Here's why,使用new[]来分配。

标签: c++ arrays visual-studio memory 64-bit


【解决方案1】:

Windows 上使用的 64 位 PECOFF 可执行格式不支持创建负载大小大于 2GB 的可执行文件,因此您无法创建大于该大小的静态分配对象。如果您尝试使用自动分配的对象在堆栈上创建这样的对象,则会遇到类似的问题。

一种可能的解决方案是动态分配对象:

int (*distanceArray)[9900000] = (int (*)[9900000]) calloc(282, 9900000);

或者,如果您希望它更 C++,并且不需要像静态分配的数组那样将其初始化为零:

int (*distanceArray)[9900000] = new int[282][9900000];

【讨论】:

  • 哎呀,为什么不建议std::vector<std::vector<int>>。毕竟它被标记为 C++。
  • @MSalters 因为我的示例与int distanceArray[282][9900000]; 几乎完全相同,只是动态分配,因此在大多数情况下可以用作“插入式”替代品。如果你想让它更 C++'ish 那么你可以使用 new[] 代替,否则从这个问题中不知道向量向量是否是可接受的替代方案我去了最直接的替换。 πάντα ῥεῖ 已经建议使用向量的向量,所以我只会重复一些我认为原始海报已经知道的事情。
  • 还有一个定义最大可能数组的“事物”。您不能有一个索引大于INT_MAX 的数组(请参阅<limits.h>)。动态或静态。在 C 或 C++ 中。
【解决方案2】:

正如 MSalters 所建议的,std::vector<std::vector<int>> 绝对是正确的选择。

对于仍然遇到此问题的任何人,这是我初始化它的方式:

std::vector<std::vector<int>> distanceArray(282, std::vector<int>(9000000, -1));

在每行 282 个项目中创建 9,000,000 列,每个值在开始时初始化为 -1。

感谢所有为帮助发表评论的人!

【讨论】:

  • 使用向量的行为与所要求的或您引用的答案中提供的不同。
猜你喜欢
  • 2014-08-02
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
相关资源
最近更新 更多