2014-04-01 48 views
0

是否有某種方法可以放大C++程序的heapsize?在android中,通過在manifest文件中聲明它很大可以很容易地做到這一點。Enlarge heapsize C++

我試圖在堆上分配10億個數組元素時遇到了這個問題。

int main() { 
int size = 1000000000; 
int* nmbr = new int[size]; 
return 0; 
} 
+0

*爲什麼要分配四GB的內存?在一臺甚至不可能的32位機器上。 –

+0

@JoachimPileborg - 1)有興趣學習2)如果尺寸非常大,那麼傳呼機不會照顧它? :-) –

+3

簡單地將代碼編譯爲'x64'或使用一些os api來分配大內存 – Paranaix

回答

2

C++本身並不知道「堆」是什麼。這是一個實現問題,所以你必須查看你的編譯器的文檔。這裏有一個谷歌搜索 「MSVC堆大小標誌」 發現了什麼:

http://msdn.microsoft.com/en-us/library/f90ybzkh.aspx

從MSDN頁面引用:

的/ HEAP選項設置以字節爲單位的堆的大小。此選項僅適用於構建.exe文件時使用的 。

+0

'/ HEAP'標誌與問題無關。它僅控制初始大小/預留,並且不影響最大大小。 –

+0

你不能使用該選項來將初始大小設置爲非常大的東西嗎?聽起來與我有關,@安德魯。 –

+1

這沒有必要。堆將根據需要自動增長(達到進程地址空間,運行時庫等強加的限制)。將初始大小設置爲較大值不會改變堆的大小。 –

2

堆大小通常是實現特定的,取決於您使用的編譯器。看看文檔,大多數提供了一種方法來改變堆大小。

爲了給你一個更普遍的答案:

堆可以是任意大小,你真的不能把它比你的電腦內存。僅僅因爲你的電腦可能擁有4GB的內存並不意味着每個程序都可以使用盡可能多的內存。 MS Visual C++中的默認堆大小爲1MB,但在運行時,程序仍會佔用大於1MB的空間。程序使用的內存也由堆棧內存,操作系統使用的句柄和線程以及最後但並非最不重要的程序代碼及其包含的所有字符串和其他文字組成。

分配內存的主要問題是如何解決它。這是x86和x64體系結構之間的主要區別。在32位Windows操作系統上,您的程序通常只有2GB可用虛擬內存(或3GB特殊設置)。

有一天你會發現,即使有足夠的剩餘空間,你也可以獲得內存不足的錯誤。如果運行時內存如此碎片化以至於運行時無法適應任何地方之間請求的數量並且通常是由頻繁的內存泄漏引起的,則會發生這種情況。爲了避免這種情況,需要大量內存的應用程序會在進行任何實際工作之前嘗試將其分配到一個大塊中,並且會有一些內存管理來處理自己的分配(SQL數據庫可能會這樣做)。這樣他們可以根據需要重新排列內存中的數據。有很多方法可以做到這一點,在Windows中您可以使用VirtualAlloc或其他形式的分配。

+0

謝謝你的好答案 - 但我不明白什麼是碎片來自?該進程的頁面映射到內存中的幀。最後一幀只能有(外部)碎片。 –

+0

我非常肯定你的程序不會因爲碎片而失敗,在你的情況下,主要原因是你無法在使用常規堆分配的32位程序中分配〜4GB的動態內存。 Windows(以及其他操作系統)限制了程序可用的虛擬空間量(通常在32位系統上大約爲2-3GB)。嘗試用'char'數組替換int數組,它可能會工作,因爲它只會分配〜1GB的內存。 – Excelcius