2012-06-26 149 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); 
} 
相關問題