c 那些事 程式執行時記憶體的劃分與使用

2022-09-09 12:48:19 字數 1087 閱讀 6753

程式執行時記憶體的分配可以分為如下幾個區域:棧,堆,bbs,資料段(有的又會把bbs和資料段統一稱為靜態儲存區,儲存靜態變數和全域性變數、常量等),**段

各個區域的說明

使用:(由編譯器自動分配和釋放)

1:是有使用者臨時定義的變數的存放區域,不包含static關鍵字定義的變數

注意點:

其中32位vs的預設棧大小為1m,可以通過vs手工修改棧的大小

64位linux的預設棧大小位10m,可以通過ulimit-s來修改

堆中的資料是動態分配的記憶體段,作用域是整個程式執行期間,直至被手工釋放。當使用malloc或new進行分配記憶體時,堆的大小會向高位址增長。

使用:1:堆中的資料是使用者手工申請和釋放的記憶體空間。

2:需要有使用者自行管理堆中資料的釋放,否則會引起記憶體洩漏問題。

注意:堆的大小總是系統的虛擬記憶體大小

堆經過不斷的申請釋放後會產生記憶體碎片,而棧不會

malloc和new的區別:

1:malloc是c語言函式,new是c++的操作符

2:malloc返回的是void*的指標,new返回的是指定型別的指標

3:malloc僅負責申請記憶體,new申請完記憶體後會自動呼叫建構函式

bss段通常是指用來存放程式中未初始化的或者初始化為0的全域性變數靜態變數的一塊記憶體區域。特點是可讀寫的,在程式執行之前bss段會自動清0。

bss段屬於靜態記憶體分配,bss節不包含任何資料,只是簡單的維護開始和結束的位址。

比如:(static) int gint =0;  初始化為0 或者 (static) int gint;未初始化

通常是指用來存放程式中已經初始化的全域性變量和靜態變量的一塊記憶體區域。資料段屬於靜態記憶體分配,可以分為唯讀資料段和讀寫資料段。字元串常量等,但一般都是放在唯讀資料段中.

注意:這裡不區分是初始化和未初始化的資料區,因為靜態資料區如果未初始化也會被預設自動初始化為0,即bbs區。

存放程式體的二進位制**,唯讀,存放在低位址處

程式執行時的記憶體

當乙個源 通過gcc編譯成a.out,執行a.out時 程式便開始了執行之旅 即程序 作業系統為程序分配堆疊空間,隨後把程式執行碼放入文字段,把程式經過初始化的全域性變數和靜態變數放入data 把程式為初始化的全域性變數和靜態變數放入bss段 並對bss段資料初始化為0 之後cpu 段指標指向mai...

c 程式執行時的記憶體分配

c 中,記憶體分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。1 棧 是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數 函式引數等。2 堆 是由new分配的記憶體塊,由程式設計師釋放 編譯器不管 一般乙個new與乙個delete對應,乙個new與乙個del...

C程式執行時的記憶體分布

該篇部落格是自己學習的總結,如果有 理解的不對的地方,希望大家可以指點。一 c記憶體空間分布圖 二 各記憶體區域詳解 1.區 text 該區域主要存放二進位制可執行檔案。2.資料區 data 資料區可詳細分為三塊區域,分別是唯讀資料區 初始化資料區 未初始化資料區。1 唯讀資料區 ordata 顧名...