C++内存分类
1 棧
存放的數(shù)據(jù):
局部變量,函數(shù)參數(shù),返回地址等。
默認(rèn)初始值:
無默認(rèn)初始值,為隨機(jī)值。
分配者:
有編譯器自動分配。
分配大小:
在程序開始后分配固定大小的棧空間,如果申請空間大于剩余棧空間,那么分配失敗。
生長方向:
棧空間的生長方向是從高地址向低地址生長,即后申請的變量的地址小于先申請的變量的地址。
溢出:
如果新申請的變量小于剩余棧空間(因?yàn)榉峙涫枪潭ǖ臈4笮?#xff09;,就會溢出。
特點(diǎn):
系統(tǒng)自動分配,申請效率高,但程序員無法控制。
是否連續(xù):
連續(xù)。
分配過程:
變量作用域:
局部作用域,它是自動對象(auto),在程序運(yùn)行期間不是一直存在,而是只在函數(shù)執(zhí)行期間存在,函數(shù)的一次調(diào)用執(zhí)行結(jié)束后,變量被撤銷,其所占用的內(nèi)存也被收回。
2 堆
存放的數(shù)據(jù):
由程序員動態(tài)(在代碼中)申請的空間。
分配者:
由程序員申請,操作系統(tǒng)分配。
大小是否固定:
大小不是固定的,是由程序員決定每次申請空間的大小。
分配過程:
申請堆空間,堆在內(nèi)存中呈現(xiàn)的方式類似于鏈表(記錄空閑地址空間的鏈表),在鏈表上尋找第一個大于申請空間的節(jié)點(diǎn)分配給程序,將該節(jié)點(diǎn)從鏈表中刪除。大多數(shù)系統(tǒng)中該塊空間的首地址存放的是本次分配空間的大小。
在C中,可以使用malloc和calloc進(jìn)行申請,兩個函數(shù)都返回申請內(nèi)存的首地址。兩者的區(qū)別為:
- 兩者參數(shù)個數(shù)不同:malloc只有一個參數(shù),即你要分配的字節(jié)數(shù),calloc有兩個參數(shù),一個為單元個數(shù),另一個為每個單元大小
- 兩者初始化不同:malloc不對分配的空間進(jìn)行初始化,所以內(nèi)存中是隨機(jī)值。而calloc會將分配的空間初始化為0
溢出:
生長方向:
堆的生長方向?yàn)榈偷刂废蚋叩刂飞L。
回收:
程序員手動釋放,如果程序結(jié)束時申請的空間還未釋放,那么操作系統(tǒng)會自動將其回收。釋放后,該塊空間會被再次鏈接到鏈表上。在申請時,如果該節(jié)點(diǎn)還有剩余空間,也會將剩余空間連接到鏈表上。
默認(rèn)初始值:
特點(diǎn):
堆是由程序員主動申請,效率低,使用起來方便但是容易產(chǎn)生碎片。
是否連續(xù):
不連續(xù)。
3 全局/靜態(tài)存儲區(qū)
存放的數(shù)據(jù):
全局變量,靜態(tài)全局變量,靜態(tài)局部變量
由誰分配:
大小是否固定:
溢出:
生長方向:
回收:
程序結(jié)束之后操作系統(tǒng)自動將其釋放。
默認(rèn)初始值:
(記得時0,但是不確定)
特點(diǎn):
在C中分為.bss段和.data段,未初始化的放在.bss段中, 初始化的放在.data中,在C++中不再區(qū)分。
是否連續(xù):
分配過程:
變量作用域:
- 全局變量的作用域是全局作用域,全局變量只需在一個源文件中定義,就可以作用于所有的源文件。當(dāng)然,其他不包含全局變量定義的源文件需要用?extern?關(guān)鍵字再次聲明這個全局變量。
-
靜態(tài)全局變量具有文件作用域。它與全局變量的區(qū)別在于如果程序包含多個文件的話,它作用于定義它的文件里,不能作用到其它文件里,即被 static 關(guān)鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態(tài)全局變量,它們也是不同的變量。
-
靜態(tài)局部變量具有局部作用域。它只被初始化一次,自從第一次被初始化直到程序運(yùn)行結(jié)束都一直存在,它和全局變量的區(qū)別在于全局變量對所有的函數(shù)都是可見的,而靜態(tài)局部變量只對定義自己的函數(shù)體始終可見。
注意,全局變量最好不要在頭文件中定義,除非能保證該頭文件只被包含一次。因?yàn)閕nclude頭文件是將頭文件代碼插入到引用位置,所以全局變量定義到頭文件會使得該變量被重復(fù)定義。
4 常量存儲區(qū)
存放的數(shù)據(jù):
存放的是常量,不允許修改
由誰分配:
大小是否固定:
溢出:
生長方向:
回收:
程序結(jié)束之后操作系統(tǒng)自動將其釋放。
默認(rèn)初始值:
特點(diǎn):
是否連續(xù):
分配過程:
變量作用域:
5 代碼區(qū)
存放的數(shù)據(jù):
存放代碼,不允許修改,但可以執(zhí)行。編譯后的二進(jìn)制文件存放在這里。
由誰分配:
大小是否固定:
溢出:
生長方向:
回收:
默認(rèn)初始值:
特點(diǎn):
是否連續(xù):
分配過程:
變量作用域:
總結(jié)
- 上一篇: 操作系统进程管理
- 下一篇: s3c2440移植MQTT