我正在做一些非常大的数组处理。我做了一个全球声明:
`float array[200][1600][811];`
当我在MS Visual Studio 2010中构建我的解决方案时,出现以下错误
LINK : fatal error LNK1248: image size (F85C8000) exceeds maximum allowable size (80000000)
现在,我知道这相当于大约1 GB的程序内存。但是这个声明适用于float [50][1600][811]
的声明,相当于250 MB。我知道默认的堆栈大小非常有限。
有一些我已经尝试过的事情。我通过Properties - >增加了VS中的堆栈大小。链接器 - >堆栈保留大小。这没有帮助。我改变了我的可执行文件以x64模式运行(据说可以解决高达2GB的内存!)。这也没有帮助。
我不希望在数组上执行malloc
,因为我确信我的代码中需要它们。我必须使它们成为全局声明,以便我可以利用堆栈/堆内存。如果我在Main ()
中声明它们,它会给我内存溢出错误。
任何指针都将非常感激。 感谢。
答案 0 :(得分:3)
如果你malloc
不利,你有两个显而易见的可能性。 C ++ 11有一个很好的数组类型可能会有所帮助:
std::array<std::array<std::array<float, 50>, 1600>, 811> matrix;
或者您可以考虑使用std::vector
循环来正确初始化所有值:
std::vector<std::vector<std::vector<float>>> matrix;
matrix.reserve(50);
for (size_t i = 0; i < 50; i++)
{
std::vector<std::vector<float>> submatrix;
submatrix.reserve(1600);
for (size_t j = 0; j < 1600; j++)
{
std::vector<float> row;
row.resize(811);
submatrix.push_back(row);
}
matrix.push_back(submatrix);
}
答案 1 :(得分:3)
看起来即使在构建x64可执行文件时,链接器也有更适合x86构建的限制。你无能为力。
唯一的解决方案是从堆中分配它。这应该与原始声明的使用方式相同。
typedef float partial_array[1600][811];
std::unique_ptr<partial_array> array = new partial_array[200];