iT邦幫忙

1

動態記憶體配置有上限嗎?

  • 分享至 

  • xImage

如題,主要是想問的是在C語言中利用動態記憶體配置會有上限嗎?
有在網路上查到說動態記憶體配置是沒有上限的,只要有記得釋放記憶體就可以,這個說法是正確的嗎?

應該這樣說,如果你開發語言的平台支援64位元,那你可定址的空間就會大到數不盡,16EB...但並非你的可用空間有那麼多,取決於執行程式的人的電腦硬體配置來決定有多少可以用,如果是8GB的電腦,那最大可用空間就不會超過28GB,其中20GB是硬碟交換檔的理論空間,一般是給定主記憶體量的2.5倍,當然也可能會超過這個值,但,你的電腦的速度,會狂降非常多,非常非常多,甚至整個卡住不動都有可能,你可以試著去alloc 幾個2³²長度的char[] 並逐位塞0x0進去試試,通常8GB的電腦不加SSD,跑個20個就可以把你的記憶體可用空間吃到99%,然後CPU 100%狂跑風扇狂轉
了解
謝謝你的解答~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2022-12-26 22:49:46
最佳解答

就程式面來說,是的。它是無上限。

但就現實面來說。除了您的記憶體本身的交換率足夠的情況下。
也需要配合作業系統的配置才行。

依然會受限於最大可用空間。
但大多數來說,其您還沒用滿可用空間的情況下。
主機一般也會呈現效能崩潰的情況。

所以,它的確是無上限。但不代表真的可以無上限的使用。
這也是為何,你會看到「只要有記得釋放記憶體就可以」這一段話了。

了解,謝謝你的解答

3

取決於作業系統,malloc 會向作業系統中負責維護可分配記憶體分頁的雙向 linked list 獲得可用的記憶體分頁,如果該 linked list 上面已經沒有可使用的記憶體分頁,如果有,則將該物理記憶體分頁映射到 Process 的 Memoey Image,如果沒有,不會產生映射,malloc 等動態記憶體分配是無法分配記憶體的。

了解。
所以這樣可以說記憶體配置在Stack方面,大小固定有限,很容易用光。但動態記憶體配置只要要作業系統有足夠的記憶體分頁可以用,那這樣就可以一直有用不完的記憶體嗎?

如果作業系統沒有限制 Process 可以獲得的記憶體上面,在系統允許,也就是上面說到的,有足夠的可用記憶體分頁時,我們就能夠為 Process 分配無上限的記憶體,但是在實務上,Process 所能夠持有的記憶體上限會受到作業系統所限制。

了解,很謝謝你的解答

我要發表回答

立即登入回答