程式編譯後執行時的記憶體分配

2021-09-29 16:46:06 字數 1635 閱讀 3497

參考文章之編譯&執行

參考文章之執行程式時的記憶體分配方式&bss段

參考文章之程式執行時的記憶體分配

參考文章之堆||棧

1.程式編譯時的記憶體狀況

編譯時不分配記憶體。

編譯器能夠識別語法,資料型別等;然後逐行逐句檢查編譯成資料的.obj檔案;然後再由連線程式將其連線成乙個exe檔案//此時的程式以exe檔案的形式存放在磁碟上。

2. 程式執行時的記憶體狀態
當執行這個exe檔案以後,此程式就被載入到記憶體中,成為程序。

此時一開始程式會初始化一些全域性變數;然後找到入口函式(main()或者winmain()),就開始按程式的執行語句開始執行。此時需要的記憶體只能在程式的堆上進行動態增加/釋放了。

首先上個例子,慢慢闡述

int a =0;

//全域性初始化區

char

*p1;

//全域性未初始化區

intmain()

text段

即**段,用來存放程式的**(函式)和部分整數常量。唯讀。

data段

初始化過的全域性變數資料段。包含初始化的靜態變數,即全域性變數和靜態區域性變數。該段的大小由程式源**中值的大小確定,並且在執行時不會更改。用來儲存初始化了的非0的全域性變數,如果全域性變數初始化為0,則編譯有時會出於優化的考慮,將其放在bss段中。因為也是全域性變數,所以在程式執行的整個生命週期內都存在於記憶體中。與bss段不同的是,data段中的變數既佔程式執行時的記憶體空間,也佔程式檔案的儲存空間。

可讀寫,因為可以在執行時更改變數的值。

bss段

用來存放沒有被初始化或初始化為0的全域性變數,因為是全域性變數,所以在程式執行的整個生命週期內都存在於記憶體中。這個段中的變數只占用程式執行時的記憶體空間,而不占用程式檔案的儲存空間。

heap堆區

為成員分配和釋放。

heap(堆)是最自由的一種記憶體,一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。它與資料結構中的堆是兩回事!分配方式倒是類似於鍊錶。在c/c++中,用alloc系統函式和new申請的記憶體都存在於heap段中。

eg:

int

main()

stack棧區

由編譯器自動分配釋放 ,存放函式引數值,區域性變數的值(即臨時變數)等。其操作方式類似於資料結構中的棧。

通常棧是向下(即向低位址)增長的,當向棧中push乙個元素,棧頂指標就會向低位址移動,當從棧中pop乙個元素,棧頂指標就會向高位址移動。棧中的資料只在當前函式或下一層函式中有效,當函式返回時,這些資料自動被釋放,如果繼續對這些資料進行訪問,將發生未知的錯誤。通常我們在程式中定義的不是用malloc系統函式或new出來的變數,都是存放在棧中的。

程式執行時的記憶體分配

一 在程式執行期間,變數儲存空間有三種 1 靜態儲存區。內存在程式編譯的時候就已經分配好了,這塊內存在程式執行期間都存在,儲存全域性變數和靜態變數。2 棧儲存區。記憶體是在程式執行期間才分配的,函式內區域性變數及函式引數的儲存單元,當 函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理...

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

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

程式及其執行時記憶體分配解析

乙個c c 程式占用的記憶體可分為以下5種 2.堆區 一般由程式設計師分配和釋放,此堆和資料結構堆完全是兩回事,此堆的分配釋放方式類似於鍊錶。執行時操作。3.全域性 靜態區 全域性變數和靜態變數存放於此。而初始化和非初始化的全域性 靜態變數又放在不同的兩塊。程式結束由系統釋放。4.文字常量區 常量字...