其實嚴格說起來 所有要到的空間 process都可以管理
先撇開虛擬記憶體不說 當使用者執行了一個程式 系統會把它放入排班
一但要執行此程式 系統就會給予一塊固定大小的連續憶記體空間
這塊連續記憶體空間生命週期就是程式的生命週期
長相也固定 網路上隨便找大概長這樣 http://i.stack.imgur.com/JQjKp.png
大致上分為 stack由上往下塞滿 heap(dynamic variable)由下往上塞滿
然後是固定的空間global(static variable)和執行指令
( 變數生命週期可以先這樣思考
(除了main()之外的變數和特地宣告成static會在global區)
一但進入"{" 就push所有參數和變數到stack
一但離開"}" 就會從stack移除這些變數 然後只留回傳值
所以函式參數是由右往左拿到
(唯一例外是function一旦宣告PASCAL 參數會由左往右拿到)
)
這些區塊基本上是不好操作 比如不易在這裡直接貼塊文章 然後讀取複製搬移
比較好的情況是我畫一塊較大的記憶體空間操作 這樣我很好搬移、複製
這種時候就是alloc使用的時候 其實也只是動用到heap區
這區間仍然是在一開始說的生命週期 如果不free掉
只是process之後heap可以用的空間少了一塊 很不方便 但不會死人
還有一個情況是動態的需求 比如我無法確定使用者會想輸入幾次資料
那要一開始就宣告陣列array[999999] 可是這樣會很浪費空間
因此靠malloc去管理 vector就是類似的機制
一但滿了就要另一塊兩倍大空間 舊的資料搬過去 然後刪除舊的空間
資料量變少 就要一個一半的空間 資料搬過去 刪除舊的空間