2012-06-26 125 views
2

我在做一些非常大的数组处理。我做的一个全球性的声明:LINK:致命错误LNK1248:图像大小超过最大允许大小(80000000)

`float array[200][1600][811];` 

当我建立我在微软的Visual Studio 2010的解决方案,我收到以下错误

LINK : fatal error LNK1248: image size (F85C8000) exceeds maximum allowable size (80000000)

现在,我知道这相当于约1 GB的程序存储器。但是这个声明适用于float [50][1600][811]的声明,这相当于250MB。我知道默认的堆栈大小非常有限。 有几件事我已经尝试过了。我通过属性 - >链接器 - >堆栈保留大小增加了VS中的堆栈大小。这没有帮助。我改变了我的可执行文件在x64模式下运行(据说这可以解决高达2GB的内存!)。这也没有帮助。

我不想在数组上做malloc,因为我知道我确实需要他们在我的代码中。我不得不让它们成为全局声明,以便我可以利用堆栈/堆内存。如果我在Main()之内声明它们,它会给我内存溢出的错误。

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

+0

你不应该(也不能)把它放在堆栈上。别尝试。出于所有实际目的,堆分配对于这种大小的东西是不可避免的。 – Mysticial

+0

现在是时候了解堆内存分配的全部内容。或者,这里有'x64'平台让你感觉舒服一段时间。 –

+0

首先要问的是,你是否需要首先使用数组。如果大多数值仍然设置为默认值,或者您可以按照不需要同时存储在内存中的顺序处理它们,则不会发生这种情况。 – reinierpost

回答

3

看来,即使你”重新构建x64可执行文件,链接器具有更适合x86构建的限制。对此你可以做的不多。

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

typedef float partial_array[1600][811]; 
std::unique_ptr<partial_array> array = new partial_array[200]; 
+0

'unique_ptr'知道使用'delete []'清理吗? –

+0

@MarkB,不是100%确定。 [微软的unique_ptr文档](http://msdn.microsoft.com/en-us/library/ee410601.aspx)提到了可以覆盖它的数组的部分特化,但我不知道它是否是标准的一部分,我不知道我的'typedef'是否击败它。 –

+0

它似乎也存在MS之外......但即使没有,也可以创建自己的删除器。在任何一种情况下,OP都可能是在讨论一个在运行时创建的对象(一般意义上),这个对象在应用程序的整个生命周期内都会持续存在。当进程退出时,主机操作系统总是可以依靠清理任何内存分配,对吧?懒惰,但它确实足够。 – Rook

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); 
} 
相关问题