回覆列表
  • 1 # TonyDeng

    這裡棧、堆的劃分,是按使用和管理手段來分的,至於這些區分佈在計算機記憶體的什麼地方,不同系統和程式語言不一樣,這個可以不理,但必須知道它們的管理方法區別在哪裡,及怎麼用。

    計算機的記憶體是一條線軸,我們建立一個數據,就在這條軸上佔據一定長度的線段。記住這點!程式執行時,不斷地要建立新的資料,佔用時用一段,也要抹掉,抹掉後空一段,你想象一下,這樣不斷地佔用和抹掉,是不是會在軸上留下一個一個的孔?舉個例子,你需要一個10位元組的空間,就在軸上按某個方向尋找連續的10位元組空位,找到就用,找不到才到最後的位置新開10位元組。在尋找的過程中,你可能會找到一段12位元組的空間,佔用了10,還剩2,那麼這個2很難有機會再用的,然後,你會發現儘管軸上有10個2位元組,你無法用它們放4位元組——這就是記憶體空洞,相當於磁碟上的檔案碎片!程式執行時間長了,操作多了,你會發現尋找空位需要的時間越來越多,效率效應出現(剛開始時是沒察覺的,有的程式沒寫好,往往是沒考慮這種動態過程)。記憶體是有限的,總有一天,你會發現找不到需要的記憶體空間了,程式崩潰。這就是作業系統管理記憶體的任務,它要負責機器上所有程式的記憶體調配,給它們提供足夠的可用記憶體。

    為解決上述問題,有兩種基本的記憶體使用手法。

    一種叫棧式管理,每次都使用後續的空間,連續分配下來,抹掉時,是倒過來依次回收,這樣絕不會留空洞。但這種用法,只能用於較少量的資料群,因為對佔據空間大的資料,往往也是不需要反覆建立和抹掉的,這樣它們佔據的空間,就阻斷了前面的回收。

    所以,對大型的資料,需要長時間保留的資料,用軸上另外的位置,叫做堆。堆上的資料,就是最前面那樣留空洞的,但它的空間大,也往往總是在最後建立資料,到一定程度空間緊張時,才會回收,這就是所謂的回收垃圾機制,這種操作需要時間,即是諸如Java之類程式執行一段時間之後呆滯假死的原因(這與執行時管理模組的策略有關)。不過,一般說,現在計算機的記憶體足夠大,小型程式是極少需要回收記憶體的,大資料不釋放,也暫時不會有危害,對那種不需要長時間執行的程式,一退出,徹底回收它所使用的一切記憶體。

    現在看到這兩種記憶體的用法了。對小的、需要頻繁重新整理的臨時資料,用棧分配。對大的,需要跨函式、跨時間段使用的長期資料,用堆。

    一般說,棧和堆分別在記憶體軸的兩端開始,向中間生長。C/C++程式的棧很小,微軟系只有1M,Linux繫有4M,其餘都是堆。

    所謂指標,是用棧上的一個整數記錄堆上一個地址,告訴程式去堆上這個位置找到真正的資料,這個地址叫入口地址。改變棧上指標的值就等於轉移了地址,但堆上的資料沒變,這就是指標“快”的來源。但是堆上任何資料的入口,都需要棧上一個指標來記錄,一旦你丟了這個地址(指標改變了值又沒有記憶原來的值就是丟了),堆上那個資料就再也找不回來了,想釋放也不能,永遠霸住記憶體,就是所謂的記憶體洩漏。

  • 2 # AA蘇西老師

    不是記憶體分割槽,應該是儲存磁碟分割槽。為的是便於管理你的電腦磁碟中的檔案!所以要分割槽

    概念不一樣的哦

    我可以給你分享一些尚學堂程式設計方面的資料

  • 中秋節和大豐收的關聯?
  • 該如何確定自己是否徹底排除了有心臟病的可能?