C C 程式分布

2021-06-21 20:12:36 字數 1246 閱讀 3906

乙個由c/c++編譯的程式占用的記憶體由上到下分為以下幾個部分:

棧區:由編譯器自動分配釋放,存放區域性變數(不包括靜態),引數,返回值。

由於棧的先進後出

特點,所以

棧特別方便用來儲存/恢復呼叫現場。

堆區:堆是用於

存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減

。當程序呼叫malloc,new/free,delete等函式分配記憶體時,

新分配的記憶體就被動態新增到堆上(堆被擴張)/釋放的記憶體從堆中被剔除(堆被縮減)

bbs區

:屬於靜態分配記憶體,通常是指用來存放程式中

未初始化

的全域性變數

的一塊記憶體區域。

資料段:

資料段屬於靜態記憶體分配。

資料段(data segment)通常是指用來存放程式中

已初始化

的全域性變數

的一塊記憶體區域,和字元常量。

**段:**段(code segment/text segment)通常是指用來存放

程式執行**

的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於

唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些

唯讀的常數變數

,例如字串常量等。程式段為程式**在記憶體中的對映.乙個程式可以在記憶體中多有個副本.

關於const常量可以參看

1.對const常量取位址時,編譯器會進行記憶體分配,並將常量轉換為立即數存入記憶體,而不是存入記錄在常量表中的位址

2.在使用常量時,編譯器回到常量表中查詢對應的常量,並將其替換,這部分沒有涉及記憶體分配,也跟曾經建立的常量的記憶體位址無關。

///記憶體分布

int g1 = 0, g2 , g3 = 0;

int max(int i)

int main(int argc, char **argv)

理論上是那樣,但windows8.1下跑,好像不對,下面是兩個完全不同的結果

C C 程式的記憶體分布

理解c c 程式中的記憶體分布,可以幫助我們減少程式設計時犯常見的錯誤,如將指向區域性變數的位址返回等。在c c 中,通常可以把記憶體理解成4個分割槽 棧 堆 全域性 靜態儲存區和常量儲存區。1 棧 通常是用於那些在編譯期間就能確定儲存大小的變數的儲存區,用於在函式作用域內 塊作用域 建立 在離開作...

C C 程式啟動後記憶體分布

1 從低位址開始,依次是 區,資料區 包含靜態資料區 常量資料區 堆 自下向上生長 動態庫的檔案對映 棧 3 不同執行緒的棧有一定的間距,基本等同於執行緒棧的限制大小,執行緒切換前會儲存當前執行緒的棧頂,這樣當再次切換回來時,可以從棧頂向下分配 4 程式的有些記憶體之存在虛擬位址空間,如果實際沒有使...

c c 程式編譯後的記憶體分布

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類...