2011-09-07 81 views
1

我有3點關於內存分配的問題,我認爲更好的將內存分配按照我的理解,它是在堆上,這僅僅是16MB分配給放進一個問題比3程序如何分配大量內存?

  1. 。諸如視頻遊戲或現代瀏覽器等程序如何管理超過1GB?

  2. 由於顯然可以使用這麼多的內存,爲什麼它不能在開始時分配?我發現我可以用高級彙編語言分配的最多大約100MB。這比16MB多得多,遠遠低於3,所以這個限制來自哪裏?

  3. 爲什麼首先分配內存,而不是分配變量並讓編譯器/系統處理它?

回答

7

當我瞭解內存分配,它是在堆中分配, 這僅僅是16MB。如何使用視頻遊戲或現代瀏覽器等程序管理超過1GB?

堆可以增長。它不限於任何價值,當然不是16MB。您可以輕鬆分配1GB堆,只需進行程序測試即可看到。

由於顯然可以使用這麼多的內存,爲什麼 不能在開始時分配?我發現在高級彙編語言中分配的最多我可以 大約100MB。這是一個大於16MB的 ,遠遠低於我有3個,那麼這個限制是從哪裏來的呢?

我不知道爲什麼你的操作系統沒有填充更大的分配請求。也許是由於內存碎片?這將是一個特定於您的設置的問題,您沒有分享。我可以分配比沒有問題更多的內存。

如果malloc(使用brk系統調用)出現某種問題,則可以嘗試使用mmap系統調用。請注意,對於GNU libc,malloc實際使用mmap而不是brk當分配足夠大(我認爲超過128k)。

爲什麼首先分配內存,而不是分配 變量並讓編譯器/系統處理它?

變量必須存儲在某個地方。你所說的是「爲什麼手動管理內存?爲什麼某些算法不能爲我做?」。編譯器和運行時組件處理分配/釋放實際上很常見 - 它被稱爲garbage collection

+1

但它不只是垃圾收集。自動分配內存的方法有限 - 稱爲局部變量。 – svick

+0

對於很多語言來說,局部變量要麼被優化掉,要麼在寄存器中短暫居住,要麼住在堆棧上。請記住,這是語言和/或語言實現的所有部分 - 僅僅因爲變量是本地的並不意味着語言不會將該值放入堆中。 –

+0

@Thomas謝謝你的回答。我想我的意思是爲什麼說明只是聲明一個變量,包括數據的本地,全局或靜態,例如用於視頻遊戲的紋理,而不是稍後分配和使用它? –