C++內(nèi)存分區(qū)
C++存在如下的內(nèi)存分區(qū)
1)棧區(qū)(stack):由編譯器自動分配釋放 ,存放函數(shù)的 參數(shù)值枣申,局部變量的值等茂契。其操作方式類似于數(shù)據(jù)結(jié) 構(gòu)中的棧。
2)堆區(qū)(heap):一般由程序員分配釋放忆首,若程序員不 釋放爱榔,程序結(jié)束時可能由OS回收。注意它與數(shù)據(jù)結(jié)構(gòu) 中的堆是兩回事糙及,分配方式倒是類似于鏈表详幽。
3)全局/靜態(tài)區(qū)(static):全局變量和靜態(tài)變量的存儲是 放在一塊的,在程序編譯時分配
4)文字常量區(qū):存放常量字符串
5)程序代碼區(qū):存放函數(shù)體(類的成員函數(shù)浸锨、全局函數(shù)) 的二進制代碼
C語言中唇聘,內(nèi)存分配有三種:
- 靜態(tài)區(qū)域分配:由編譯器自動分配與釋放,內(nèi)存在編譯的時候已經(jīng)分配好柱搜,這塊內(nèi)存在整個程序的運行期間都存在直到程序結(jié)束時才被釋放迟郎,如全局變量與static變量。
- 棧分配:由編譯器在程序運行時從棧上分配聪蘸,函數(shù)棧退出時自動釋放谎亩。棧分配的運算在處理器的指令集中,所以它的運行效率很高宇姚,但能分配的內(nèi)容是有限的匈庭。
- 堆分配:有程序員主動調(diào)用內(nèi)存分配函數(shù)來申請內(nèi)存,且使用完畢后由程序員自己釋放浑劳,其使用非常靈活阱持,但其分配方式是通過調(diào)用函數(shù)來實現(xiàn),效率沒棧高魔熏。malloc,alloc等
程序在內(nèi)存中的分布
中文版
內(nèi)核空間
-
棧
1衷咽、stack存放函數(shù)的臨時變量鸽扁、局部變量、函數(shù)參數(shù)和返回值
2镶骗、由編譯器自動分配和釋放桶现。 -
動態(tài)鏈接庫(共享映射區(qū))
調(diào)用的庫文件,位于堆和棧之間
-
堆
heap用來動態(tài)分配內(nèi)存鼎姊,由程序員控制骡和,交由程序自身決定開辟和釋放。
-
全局數(shù)據(jù)區(qū)
.bss
bss
段用來存放沒有被初始化和已經(jīng)被初始化為0的全局變量.data
data
段用來存放已經(jīng)被初始化為非0的全局變量 -
常量區(qū)
.rodata
rodata
段用來存放常量數(shù)據(jù)相寇、被編譯器自動存放來的字符串和加const
關(guān)鍵字的常量數(shù)據(jù)慰于。 -
代碼區(qū)
.text
text
段用來存放代碼和部分整數(shù)常量,該段是可執(zhí)行的唤衫。
堆與棧
棧是一種的“先進后出”的存儲結(jié)構(gòu)婆赠。
堆是一種完全二叉樹。節(jié)點從左到右填滿佳励,最后一層的樹葉都在最左邊休里。(即如果一個節(jié)點沒有左邊兒子,那么它一定沒有右邊兒子)赃承,每個節(jié)點的值都小于(或者大于)其子節(jié)點的值(大頂堆份帐、小頂堆)。它的特點是可以使用一維數(shù)組來表示楣导。堆的操作也可通過數(shù)據(jù)元素交換的形式解決,非常適合內(nèi)存空間線性的特點畜挨。
參考地址