链接:致命错误LNK1248:图像大小超过最大允许大小(80000000)

时间:2012-06-26 16:29:20

标签: c++ visual-studio-2010 memory-management out-of-memory

我正在做一些非常大的数组处理。我做了一个全球声明:

`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 ()中声明它们,它会给我内存溢出错误。

任何指针都将非常感激。 感谢。

2 个答案:

答案 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];