1. 程式人生 > >Malloc最多一次能分配多少記憶體

Malloc最多一次能分配多少記憶體

相信C/C++程式設計師都用過這個庫函式, 這個函式時程式設計師申請堆中的記憶體,需要自己手動釋放記憶體,所以這個函式也是Memory Leak的根源。但是malloc一次最多能申請多少記憶體呢,顯然這個跟我們實體記憶體的大小和
我們的系統,編譯器都有一定的關係。已經不記得之前在哪裡遇到過這個問題,今天忽然想起來了,於是自己做了個實驗。
我的開發環境是Windows7 64位,記憶體8G,IDE是codeblocks,支援開源,下面是測試程式碼:

點選(此處)摺疊或開啟

  1. #include <iostream>
  2. #include
    <stdio.h>
  3. #include <stdlib.h>
  4. int64_t maximum = 0;
  5. using namespace std;
  6. int main()
  7. {
  8.     cout<<"sizeof(void*) is:"<<(int)sizeof(void*)<<endl;
  9.     cout<<"sizeof(int) is:"<<sizeof(int)<<endl;

  10.     int64_t blocksize[] = {1024*1024, 1024, 1};
  11.     int64_t i, count;
  12. for(i=0;i<3;i++)
  13. {
  14.         maximum = 0;
  15. for(count=1;;count++)
  16. {
  17.                 void *block = (void*)malloc(maximum + blocksize[i] * count);
  18. if(block)
  19. {

  20.                         maximum = maximum + blocksize[i] *count;
  21.                         free(block);
  22. }
  23. else
  24. {
  25.                         break;
  26. }
  27. }
  28.          cout << "maxmium malloc size:"<<maximum/1000000<<"M"<<endl;
  29. }
  30.     cout << "Hello world!" << endl;
  31.     return 0;
  32. }

程式輸出如下:

這個結果是不是很蹊蹺,我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) | 給主人留下些什麼吧!~~ 86_avatar_small.jpg

2013-07-18 23:30:24

要明白一件事情,你沒有在malloc後馬上使用該記憶體,malloc後馬上memset一下,你就會發現有什麼不同了!
希望你可以實踐一下!

回覆 | 舉報 83_avatar_small.jpg

2013-07-16 19:37:07

恩,謝謝,編譯器是多少位的預設編譯的就是多少位的程式,特別是windows下的mingw只能編譯32位的程式

回覆 | 舉報 74_avatar_small.jpg

2013-07-16 09:45:56

32位編譯器也能編出64位程式,所以並不在於編譯器本身是多少位,而是編譯器是否支援64位以及編譯選項

回覆 | 舉報 評論熱議