栈、堆、静态存储区
可編程內存基本上分為幾大部分:棧區、堆區和靜態存儲區。
1.棧(stack)
保存局部變量和局部函數的,函數結束,其局部變量和參數的生命就結束了(當然是不包括static變量)。即釋放了棧的空間(順便提一下:棧特點為后進先出的!)。
函數被調用的時候需要push(壓棧),函數return后需要pop(彈棧)。
棧的分配運算內置于處理器的指令集中,效率極高,但是分配的內存容量有限。
2.堆(heap)
也稱動態內存分配區。
程序員向操作系統申請的內存空間。程序在運行的時候用malloc或new申請任意大小的內存,程序員自己負責在適當的時候用free或delete釋放內存。動態內存的生存期可以由我們決定,如果我們不釋放內存,程序將在最后才釋放掉動態內存。可存儲較大的數據。
堆是以匿名方式保存的,只能通過指針訪問,安全性最高,由程序員分配與釋放,自由度最高!
堆中變量、對象的使用
?
3.靜態存儲區
內存在程序編譯的時候已經分配好。這塊內存在整個程序的運行期間都存在。
主要存放靜態數據、全局數據和常量。
**************************************************************************
堆棧的不同:
(1)內存申請方式的不同:如果函數中聲明一個局部變量int a,系統會自動在棧中為a 開辟空間;而堆空間需要程序員自己申請,還需要指明變量的大小。
(2)系統響應的不同:只要棧的剩余空間大于所申請的空間,系統將為程序提供內存,否則提示overflow,棧溢出;而對于堆,系統在收到申請空間的要求后,遍歷操作系統用于記錄內存空間地址的鏈表,當找到一個空間大于所申請空間的堆結點后,就會將該結點從記錄內存空閑地址的鏈表中刪除。并將該結點的內存分配給程序,然后在這塊內存區域的首地址處記錄分配的大小。這樣在使用delete來釋放的時候,delete才能正確識別并刪除該內存區域的所有變量。另外,申請的內存空間與堆結點的內存空間不一定相等,這是系統個會自動將堆結點上多出來的那一部分內存空間回收到空閑鏈表中。
(3)空間大小的不同:棧是一塊連續的區域,大小在編譯時就確定的常數,有系統預先根據棧頂的地址和棧的最大容量定義好的;堆是不連續的區域,各塊區域由鏈表串聯起來。串聯起來的內存空間叫作堆!上限是由系統的虛擬內存來定的。
(4)執行效率的不同:棧比較快,由系統自動分批;堆速度較慢,且容易產生內存碎片。
(5)執行函數時的不同:函數調用時,第一個進棧的是被調函數下一行的內存地址(棧的先進后出)。其次是函數的參數,假如參數duo與一個,那么次序是從右往左。最后才是函數的局部變量。
如:
g(a,b); //第二個進棧
cout<<a; //第一個進棧
在棧分布(從上到下):
局部變量
參數a
參數b
第二行代碼
不可能有內存碎片。進來有序,退出有序....
?
存儲在棧中的對象,遇到 } ,即刪除局部變量。
**************************************************************************
?
附:其他區域(或者其他叫法)
(1)數據段(屬于數據存儲區)是存取全局變量和靜態變量的。全局變量和靜態變量是放在一塊的,初始化的在一塊區域,未初始化的在相鄰的另一塊區域。程序結束后由系統釋放。
(2)代碼段是存取函數體的二進制代碼的。
(3)文字常量區,常量和字符串就放在這里,程序結束之后由系統釋放。
(4)寄存器區,用來保存棧頂指針和指令指針。
****************************************************************************
與存儲類型相關的幾個屬性:
atuo:在聲明局部變量時,若不指定 static,默認均是 auto,這類變量都是動態分配存儲空間的,數據存儲在動態存儲區中。
static:在聲明局部變量時,使用關鍵字 static 將局部變量指定為“靜態局部變量”,這樣在函數調用結束后不消失而保留原值,即占用的存儲單元不釋放,在下一次函數調用時,該變量已有值就是上次函數調用結束時的值。
register:在聲明動態局部變量或者函數形參時,可將變量聲明為register,這樣編譯系統就會為變量分配一個寄存器而不是內存空間,通過這種方式可提升對某些局部變量頻繁調用的程序的性能。(寄存器運算速度遠高于內存)
extern:用于擴展全局變量的作用域,比如如果函數想引用一個外部變量,但該外部變量在該函數后定義,那么這個函數需要使用 extern 來聲明變量,這樣才能使用在該函數后面定義的全局變量。此外,extern 還可以在多文件的程序中聲明外部變量。
?
?
?
在Linux中還存在這一個BBS段!
可參考http://blog.csdn.net/jxhui23/article/details/8064766
?
轉載于:https://www.cnblogs.com/simonLiang/p/5729649.html
總結
- 上一篇: “珠箔笼寒月”下一句是什么
- 下一篇: Android系统手机端抓包方法