一.堆和棧的區(qū)別
1.棧區(qū)(stack)- 由編譯器自動分配釋放,存放函數(shù)的參數(shù)值埂材,局部變量的值等钥庇。類似數(shù)據(jù)結構中的棧(先進后出)
2.堆區(qū)(heap) - 一般由程序員分配釋放襟企,若程序員不釋放樱拴,程序結束時可能由OS回收。分配方式類似鏈表(動態(tài)分配)
3.全局區(qū)(靜態(tài)區(qū))(static) - 全局變量和靜態(tài)變量的存儲是放在一塊的畔濒,初始化的全局變量和靜態(tài)變量在一塊區(qū)域剩晴,未初始化的全局變量和靜態(tài)變量在相鄰的另一塊區(qū)域。程序結束后由系統(tǒng)釋放
4.文字常量區(qū) - 常量字符串就是放在這里的侵状。程序結束后由系統(tǒng)釋放
5.程序代碼區(qū) - 存放函數(shù)體的二進制代碼
二.理論知識
1.申請方式
stack:由系統(tǒng)自動分配
heap:需要程序員自己申請赞弥,并指明大小
2.申請后系統(tǒng)的響應
棧:只要棧的剩余空間大于所申請空間,系統(tǒng)將為程序提供內(nèi)存壹将,否則將報異常提示棧溢出
堆:首先應該知道操作系統(tǒng)有一個記錄空閑內(nèi)存地址的鏈表嗤攻,當系統(tǒng)收到程序的申請時,會遍歷該鏈表诽俯,尋找第一個空間大于所申請空間的堆結點,然后該結點從空閑結點鏈表中刪除,并將該結點的空間分配給程序暴区,另外闯团,對于大多數(shù)系統(tǒng),會在這塊內(nèi)存空間中的首地址處記錄本次分配的大小仙粱,這樣房交,代碼中的delete語句才能正確的釋放本存儲空間。另外伐割,由于找到的堆結點大小不一定正好等于申請的大小候味,系統(tǒng)會自動的將多余的那部分重新放入空閑鏈表中。
3.效率比較
棧在分配時速度較快
棧在存儲時較快(堆靈活性大)