2012-11-02 231 views
1

可能重複:
maximum memory which malloc can allocate!的malloc的最大尺寸()

我怎麼能知道堆我可以malloc()佔據的最大尺寸。 我使用MS Visual Studio 2010.

+0

目前還不清楚你在問什麼。你是否希望malloc()可以分配的最大大小給予無限的內存,或者你是否問如何確定在你運行的系統中有多少內存可用? – Caleb

+2

您可以*詢問* SIZE_MAX,但幾乎肯定會失敗。您可以成功獲得多少*取決於許多因素(32位與64位,C運行時版本,操作系統版本,最大頁面文件大小,可用物理內存等)。 –

回答

7

有操作系統相關的方法來找出有多少虛擬內存可用於您的過程,但我不知道如何在Windows上執行此操作。然而,你可以通過尋找+減半搜索來找到它,用更大的參數來計算malloc直到失敗,然後迴歸它所處的值。類似於

for(i=1; v=malloc(i); i<<=1) free(v); 

到此爲止,您知道i/2字節正常,而i字節不正常。現在,對實際最大二分法搜索:

for(a=(i>>1), b=i; a < b-1;) 
{ 
    c=(a+b)>>1; 
    if(v=malloc(c)) { a=c; free(v); } 
    else b=c; 
} 

在這一點上,a是可以成功地分配量最大。

+0

我投了票,因爲我在過去完全這樣做(儘管不太簡潔 - 很棒!)。我在Windows 7上使用GCC 4.8在C++中使用new/delete代替malloc/free。結果?我在一個塊中分配了1,953,169,376個字節,併成功用值填充,然後訪問這些值 - 簡而言之,它可以工作。 – rmcghee

4

那麼,爲什麼不看看它的論點...... size_t。因此,您可以分配size_tSIZE_MAX)作品中的任何內容,但無論如何它都基於size_t,如果不是,則爲malloc s簽名仍然是您必須處理的內容。

你的問題有點不清楚,但如果你真的在問什麼是最大堆大小,理論上它是由本地指針大小決定的。例如,在32位系統上,指針可以保存0到2^32-1之間的任何地址(當然,地址0通常不是有效的)。

當然,在實踐中,還有一些必須考慮的細節,其中大多數是操作系統特定的。機器中安裝了多少物理內存(RAM)?如果你的操作系統使用虛擬地址,那麼這會讓事情變得複雜,因爲你不再受物理內存的限制(雖然性能會隨着分頁不斷而下降)。

它有助於瞭解virtual address space在思考您的程序可以在給定平臺上分配多少時的工作方式。

+2

我想OP想知道他/她可以分配多少內存 - 也就是說,有多少內存可以安全分配。 – Caleb

+0

@Caleb:是的,我想知道這件事。我會添加一些東西, –

+2

@Ed http://stackoverflow.com/questions/2513505/how-to-get-available-memory-cg – Austin