vmware, visual studio, steam dota2這種需要極大內存的程序是如何分配內存的?

為什麼我自己寫的程序不能分配2G的內存?比如char *p, p = malloc(1024 * 1024 * 1024 * 2), 會編譯不通過,提示overflow.那如題所示的大型程序都是如何分配內存的,我開vmware的時候,打開一個虛擬機會看到系統內存佔用率有很明顯的增加,

虛心請教各位大神。

系統: ubuntu 14.10, 64bit, gcc 4.9


p = malloc(1024 * 1024 * 1024 * 2L);


這些程序不是一次性分配這麼多的,有些可能是用mmap分配的,大致來說這個會受到heap size的影響,晚上回來繼續補充。

有國外大神做過實驗,參見這裡:http://stackoverflow.com/questions/3463207/how-big-can-a-malloc-be-in-c


申請太大的連續空間,在一些功能簡單的OS上會容易因為碎片問題而失敗啊。操作系統課的老師偷懶了!

解決方案很簡單,鏈表 + 塊式內存啊,數據結構老師也偷懶了!


#include &
#include &

int main(void)
{
int i = 0;
for (; i&<1024; ++i) { char* p = (char*)malloc(1024 * 1024 * 1024); if (p==NULL); { printf("%d %s ",i,"malloc error"); break; } } return 0; }

樓主的溢出在1024*1024*2的地方,改成2L就好了。試試我的代碼,你就明白分配內存跟系統內存有關係,但是又沒關係,好好看操作系統。


題主先要能理解編譯錯誤,鏈接錯誤和運行錯誤的區別。其次對於內存分配極限值的問題,一般首先會受限於進程地址空間的可用性,這與操作系統,體系架構有很大關係。


推薦閱讀:

想成為 Linux 驅動工程師,需要讀些什麼書?
求推薦學習linux命令的書籍?
在 2015 年的今天,Linux 是否比十多年前更適合大眾使用了?
gentoo 和 archlinux 有什麼優缺點?
Linux 和 Mac 下有什麼好用的類似於 Visio 的畫圖軟體?

TAG:Linux | C編程語言 | 內存管理 |