4

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

`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 -> Linker -> Stack reserved size 增加了 VS 中的堆栈大小。这没有帮助。我将我的可执行文件更改为在 x64 模式下运行(据说可以寻址高达 2GB 的内存!)。这也没有帮助。

我不想malloc在数组上做 a ,因为我确定我的代码中需要它们。我必须对它们进行全局声明,以便我可以利用堆栈/堆内存。如果我在 my 中声明它们Main (),则会出现内存溢出错误。

任何指针将不胜感激。谢谢。

4

2 回答 2

4

似乎即使您正在构建 x64 可执行文件,链接器也有更适合 x86 构建的限制。你对此无能为力。

唯一的解决方案是从堆中分配它。这应该以与您的原始声明相同的方式使用。

typedef float partial_array[1600][811];
std::unique_ptr<partial_array> array = new partial_array[200];
于 2012-06-26T17:05:30.837 回答
3

如果你是malloc不利的,你有两个立即明显的可能性。C++11 有一个很好的数组类型,它可能会有所帮助:

std::array<std::array<std::array<float, 50>, 1600>, 811> matrix;

或者您可以考虑使用std::vectorwith 循环来正确初始化所有值:

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);
}
于 2012-06-26T16:44:28.437 回答