Malloc最多一次能分配多少記憶體
阿新 • • 發佈:2019-01-03
相信C/C++程式設計師都用過這個庫函式, 這個函式時程式設計師申請堆中的記憶體,需要自己手動釋放記憶體,所以這個函式也是Memory Leak的根源。但是malloc一次最多能申請多少記憶體呢,顯然這個跟我們實體記憶體的大小和
我們的系統,編譯器都有一定的關係。已經不記得之前在哪裡遇到過這個問題,今天忽然想起來了,於是自己做了個實驗。
我的開發環境是Windows7 64位,記憶體8G,IDE是codeblocks,支援開源,下面是測試程式碼:
閱讀(1930) | 評論(4) | 轉發(6) | 給主人留下些什麼吧!~~
我們的系統,編譯器都有一定的關係。已經不記得之前在哪裡遇到過這個問題,今天忽然想起來了,於是自己做了個實驗。
我的開發環境是Windows7 64位,記憶體8G,IDE是codeblocks,支援開源,下面是測試程式碼:
點選(此處)摺疊或開啟
-
#include <iostream>
-
#include
-
#include <stdlib.h>
-
int64_t maximum = 0;
-
using namespace std;
-
int main()
-
{
-
cout<<"sizeof(void*) is:"<<(int)sizeof(void*)<<endl;
-
cout<<"sizeof(int) is:"<<sizeof(int)<<endl;
-
int64_t blocksize[] = {1024*1024, 1024, 1};
-
int64_t i, count;
-
for(i=0;i<3;i++)
-
{
-
maximum = 0;
-
for(count=1;;count++)
-
{
-
void *block = (void*)malloc(maximum + blocksize[i] * count);
-
if(block)
-
{
-
maximum = maximum + blocksize[i] *count;
-
free(block);
-
}
-
else
-
{
-
break;
-
}
-
}
-
cout << "maxmium malloc size:"<<maximum/1000000<<"M"<<endl;
-
}
-
cout << "Hello world!" << endl;
-
return 0;
- }
程式輸出如下:
這個結果是不是很蹊蹺,我64位的系統,而且8G的記憶體,佔用了很少,但是這裡為什麼只分配了2G不到呢,我原來的推想是作業系統保留一部分記憶體(大概2G),還有差不多6G可以申請,所以這個結果讓我很驚訝。於是我又在64bit的linux下,記憶體4G,用同樣程式碼進行了測試,這次輸出是
這次輸出似乎跟預想差不多,4G記憶體能分配3.5G左右,那麼windows下是什麼問題導致我8G的記憶體只能malloc 2G不到呢。細想一下,覺得肯定是編譯器的問題,果然我的codeblocks預設的編譯器是mingw-32-g++,可能細心的讀者已經看到前面的sizeof(void*)的值是4,也就是說在windows下codeblock下預設將該程式編譯成32位的了,所以才會出現分配2G不到的記憶體,感興趣的可以用其他的64位的編譯器測試一下,應該會得到正常值。
總結一下:
程式是32位或者是64位並不是由你的作業系統決定,而是編譯器決定,準確的說是決定於編譯器和編譯選項,64位系統照樣可以跑32位的程式。
閱讀(1930) | 評論(4) | 轉發(6) | 給主人留下些什麼吧!~~
2013-07-18 23:30:24
要明白一件事情,你沒有在malloc後馬上使用該記憶體,malloc後馬上memset一下,你就會發現有什麼不同了!
希望你可以實踐一下!
2013-07-16 19:37:07
恩,謝謝,編譯器是多少位的預設編譯的就是多少位的程式,特別是windows下的mingw只能編譯32位的程式
回覆 | 舉報2013-07-16 09:45:56
32位編譯器也能編出64位程式,所以並不在於編譯器本身是多少位,而是編譯器是否支援64位以及編譯選項
回覆 | 舉報 評論熱議