可能重複:
maximum memory which malloc can allocate!的malloc的最大尺寸()
我怎麼能知道堆我可以malloc()
佔據的最大尺寸。 我使用MS Visual Studio 2010.
可能重複:
maximum memory which malloc can allocate!的malloc的最大尺寸()
我怎麼能知道堆我可以malloc()
佔據的最大尺寸。 我使用MS Visual Studio 2010.
有操作系統相關的方法來找出有多少虛擬內存可用於您的過程,但我不知道如何在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
是可以成功地分配量最大。
我投了票,因爲我在過去完全這樣做(儘管不太簡潔 - 很棒!)。我在Windows 7上使用GCC 4.8在C++中使用new/delete代替malloc/free。結果?我在一個塊中分配了1,953,169,376個字節,併成功用值填充,然後訪問這些值 - 簡而言之,它可以工作。 – rmcghee
那麼,爲什麼不看看它的論點...... size_t
。因此,您可以分配size_t
(SIZE_MAX
)作品中的任何內容,但無論如何它都基於size_t
,如果不是,則爲malloc
s簽名仍然是您必須處理的內容。
你的問題有點不清楚,但如果你真的在問什麼是最大堆大小,理論上它是由本地指針大小決定的。例如,在32位系統上,指針可以保存0到2^32-1之間的任何地址(當然,地址0通常不是有效的)。
當然,在實踐中,還有一些必須考慮的細節,其中大多數是操作系統特定的。機器中安裝了多少物理內存(RAM)?如果你的操作系統使用虛擬地址,那麼這會讓事情變得複雜,因爲你不再受物理內存的限制(雖然性能會隨着分頁不斷而下降)。
它有助於瞭解virtual address space在思考您的程序可以在給定平臺上分配多少時的工作方式。
目前還不清楚你在問什麼。你是否希望malloc()可以分配的最大大小給予無限的內存,或者你是否問如何確定在你運行的系統中有多少內存可用? – Caleb
您可以*詢問* SIZE_MAX,但幾乎肯定會失敗。您可以成功獲得多少*取決於許多因素(32位與64位,C運行時版本,操作系統版本,最大頁面文件大小,可用物理內存等)。 –