我有一个需要大型2d数组的小型C ++程序。
int distanceArray[282][9900000];
我知道标准的32位控制台应用程序由于32位应用程序的2GB上限而无法为我的进程分配这么多内存。但是,尽管我已将我的编译器配置为使用本机amd64工具集,但在尝试构建应用程序时仍然会出现相同的错误:
Error C2148 total size of array must not exceed 0x7fffffff bytes
我的系统上有16GB的RAM,所以我知道我的物理内存应该不是问题。如果我的计算是正确的,这应该只占3GB左右。但是,我不明白为什么我似乎无法让64位编译器正常工作。我按照Microsoft's website上的说明概述了如何使用64位编译器,但无论我做什么,我都会收到同样的错误。任何帮助将不胜感激。谢谢!
我知道之前已经问过这个问题,但现有的答案对我没有帮助。感谢您帮助我找到问题的任何尝试。
答案 0 :(得分:5)
Windows上使用的64位PECOFF可执行格式不支持创建负载大小超过2GB的可执行文件,因此您无法创建大于此值的静态分配对象。如果尝试使用自动分配的对象在堆栈上创建这样的对象,则会遇到类似的问题。
一种可能的解决方案是动态分配对象:
int (*distanceArray)[9900000] = (int (*)[9900000]) calloc(282, 9900000);
或者,如果你想要更多的C ++,并且不需要将它初始化为零,就像静态分配的数组一样:
int (*distanceArray)[9900000] = new int[282][9900000];
答案 1 :(得分:1)
根据MSalters的建议,std::vector<std::vector<int>>
绝对是可行的方法。
对于仍然遇到此问题的人,以下是我对其进行初始化的方法:
std::vector<std::vector<int>> distanceArray(282, std::vector<int>(9000000, -1));
在282项的每一行中创建9,000,000列,每个值在开始时初始化为-1。
感谢所有评论帮助的人!