c++中在堆和栈中申请空间的差别
堆中和棧中申請的空間的比較, 我找到了下面的比較:
棧的情況:
棧上分配空間的好處是快,而且對象生存期是自動的,離開當前域之后就自動析構回收。
壞處就是棧空間有限,而且不能人為控制對象的生存期,
比如你無法將一個函數內部的棧上的對象返回,因為這個函數執行完畢后棧空間會自動回收。
堆的情況
堆上分配空間就相反,new一個空間出來是較慢的,而且對堆上對象的訪問也稍慢于棧上。
一旦new一個空間出來,需要自己手動去delete回收,系統不會幫你管理回收(用GC的除外),
但是分配空間大小靈活,而且正因為是手動回收的,你可以自由控制對象生存期,常用來跨域傳遞對象。
管理方式不同:棧是由編譯器自動管理的。堆的釋放工作是由程序員來控制的(delete),容易忽略。
空間大小不同:棧,一般都是有一定的空間大小。堆內存幾乎是不受限制的。
碎片的產生:堆,頻繁的new/delete勢必會造成內存空間的不連續,造成大量的碎片空間,程序效率降低。棧,不會存在這個問題,棧是先進后出的隊列,所以永遠不可能在內存塊中間出現碎片。
分配方式不同:堆是動態分配的,沒有靜態分配的堆。棧有兩種分配方式:靜態和動態,靜態分配時編譯器自己完成的(局部變量)動態分配是由alloca函數進行分配。
分配效率不同:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持。堆是C++函數庫提供的,機制比較復雜,所以棧的分配效率比堆的效率高。
堆中的空間是動態申請的 運行時才分配的,棧中的空間是在編譯時,鏈接器進行鏈接的時候就會確定其地址的,我們申請的局部變量就是棧空間。堆與棧相比劣勢什么的我覺得談不上,作用不同,不好評價。就比如靜態數組和動態數組,當他們用來存儲輸入的時候,由于無法確定輸入數量,無疑動態在這里更適合。
從效率上來說,村沖在棧中效率是更好的,因為在編譯時就會確定其地址。但是在堆中申請空間則不同,要動態的分配地址,有時還會要與物理地址建立映射,開銷是比棧更大的。
轉載于:https://www.cnblogs.com/hahawgp/archive/2013/04/08/3008737.html
總結
以上是生活随笔為你收集整理的c++中在堆和栈中申请空间的差别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 细学PHP 09 MySql
- 下一篇: 序列化对象C++对象的JSON序列化与反