1. 程式人生 > >關於為什麼要進行人工的動態分配記憶體

關於為什麼要進行人工的動態分配記憶體

2015年06月15日 13:39:32 form88 閱讀數:931

舉個簡單的例子,你是要把你這輩子要吃的鹽巴全部買下來,還是說你的鹽巴什麼時候不夠了再去買? 你能確定你這輩子吃多少鹽巴嗎?

當然你可以估計出來,也可能估計的差不多,但是你肯定不會這麼做,合理的方法是,隨用隨買,我是這麼理解的

有些時候,你根本不清楚你即將處理的資料有多大,你用來快取的記憶體夠用嗎。 舉個例子,C風格的字串跟STL的 string,那個好用,不用多說。 為何好用,就是你用前者,如果不自己動態分配記憶體,就要寫死一個MAX,這個MAX過大,浪費記憶體,太小,很有可能在某次處理的時候不夠用。

棧才有2兆大小,不動態,如果超過兩兆,就不靈了

如果已知要用的空間不大且大小是預知的範圍內,直接用棧就好了。用堆可以申請4G的記憶體空間,一般的棧也就2M,而且一不小心就會面對棧溢位的問題。

假設需要完成這樣一個任務: 從某個檔案中讀取若干個整數,將它們排序, 輸出到另一個檔案。 我們不知道“若干個”到底是多少個, 可能是幾個, 也可能是幾萬個,幾百萬個,幾千萬個…… 樓主打算怎麼做呢?

首要要弄清楚 堆和棧的區別: 棧是執行緒相關的  一個執行緒會建立一個棧,函式中的區域性變數 實際上是在棧裡面的  函式返回後 就從棧中pop出來,棧的容量是有限的  超過一定大小就棧就會擊穿了,比如你寫了深層次的遞迴,然後再函式中使用大量的陣列,很容易就擊穿了 堆是動態儲存空間,一個程序預設只有一個堆,程序中所有的執行緒都共享這個堆的空間,所以你在一個執行緒中從堆中分配記憶體,再另一個執行緒中也可以訪問,同時堆也更容易擴充套件和交換資料

對於要處理的資料我們常常會不知道到底有多大,所以採用動態開闢的方法,這樣才可以更加合理的對資料進行處理

陣列和動態分配是兩個相對的東西,在處理資料變化較小時,可以設定一個數組上限,前提是待處理的資料不能超過這個上限,這個時候用陣列是較好的.但如果數量變化較大而又無法確定資料上限到底有多大時,這個時候最好是用動態分配,不然的話,就像前面人提到如果使用一個數組的話,太小了可能會溢位,太大了又有可能會浪費. 如果用到遞迴,最好儘量避免用區域性陣列,如果一定要用陣列的話,那最好改為static型別的陣列

在一些簡單的小程式裡,動態分配看不出優勢來,但是在一些大程式裡,有很多的不確定的變數,如果不用動態分配的話,工作量是很大,還造成資源浪廢,要知道在電腦裡資源是很缺的

對一個物件的操作,特別是大小未知的時候,常用動態分配。

雖然是由於物件大小的不確定性 貌似導致動態分配很有必要,但我認為最主要原因應該是棧太小的限制。 特別是對於程序本身不大,但是可能操作很大的資料時,就可以使用動態分配記憶體處理資料,二棧就安排很小但夠用就可以 了。